在react / redux中排队AJAX请求

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在react / redux中排队AJAX请求相关的知识,希望对你有一定的参考价值。

我有一组需要在服务器端按顺序执行的任务。问题是我似乎无法弄清楚如何在不混淆商店的情况下实现队列。

我认为最好的解决方案可能是将它全部封装在一个类中,只需使用像SET_QUEUE(queue)这样的单一动作来使其保持最新。但是那时反应引擎效果不佳 - 对象从方法中被剥离。

可能的解决方案可能是在类中添加一些序列化/反序列化功能。但是,如果在状态同步之前请求启动,我担心会有松散的结局吗?

以下是我的一次尝试的草稿。

export default class Queue {
    constructor() {
        this.waiting = [];
        this.finished = [];
        this.processingNow = null;

    }

    register(items) {
        this.waiting = items;
    }

    process() {
        if(!this.isBusy() && this.hasWaitingItems()) {
            this.processItem(this.waiting.shift());
        }
    }

    hasWaitingItems() {
        return this.waiting.length > 0;
    }

    isBusy() {
        return this.processingNow == null;
    }

    processItem(item) {
        this.processingNow = item;

        $.ajax({
            type: "POST",
            url: "/perform/" + item.data.name,
            data: {
                data: JSON.stringify(item.data)
            },
            success: function(result){
                this.processingNow = null;    
            }.bind(this),
            error: function(error) {
                ....
                this.processingNow = null;
                this.waiting = [];
            }.bind(this)
        });        
    }
}

在父级 - 一个组件

componentWillReceiveProps(nextProps){
    if(!_.isEqual(this.props.queue, nextProps.queue)) {
        nextProps.queue.process();
    }
}

这可能吗?是否有处理队列/连续ajax调用的最佳实践?

答案

我不确定我是否完全理解你的问题,但在我目前的项目中,我也有类似的问题,需要将一批AJAX请求按特定顺序发送到我们的REST API。我最终使用了Redux Observables https://redux-observable.js.org,它是Redux的RxJS中间件。它允许我听取某些redux动作,并通过另一个动作启动连续的AJAX请求来对它们做出反应。

如果您还不熟悉RxJS,可能需要一段时间才能学习并了解它是如何工作的,但在我看来,这是值得的。对我来说,它已成为在各种情况下使用的重要工具。

以上是关于在react / redux中排队AJAX请求的主要内容,如果未能解决你的问题,请参考以下文章

REACT 如何使用 Redux 和 Axios(使用 promise 中间件)发出 AJAX 请求?

react + redux + saga +服务器端渲染+如何停止服务器端渲染页面的额外ajax调用?

如何防止 AJAX 请求排队? [复制]

使用 React、Redux 和 Axios 处理异步请求?

如何使用 React Redux 发出 post 请求?

React/Redux 中具有默认值的文本输入