当前位置: 首页 > 面试题库 >

反应-控制多个Ajax调用

韦原
2023-03-14
问题内容

在我的React应用程序中,我有一个网格。用户可以一次选择许多网格行,然后单击按钮以对选定的网格行执行批量操作。

在服务器端,单击批量操作后,我有一个脚本要针对每个选定的行执行(为了简化问题,我在下面的示例中为每个选定的行调用“
jsonplaceholder.typicode.com”)按钮。单击批量操作按钮时,将在操作创建器中获得selectedRows,在该操作器上遍历selectedRows并为每个选定行进行ajax调用。

由于selectedRows可能包含1000多个项目,并且如果我只是使用forEach循环迭代地进行ajax调用,则浏览器页面最终可能会停止响应,然后再解决每个请求。因此,我在下面使用了解决方案,以5个为一批发送请求,然后等到5个解决为止。

// Action creator, selectedRows is an array.
function onGridRowsSelection(selectedRows) {
   makeBatchCalls(selectedRows,5)
}

async function makeBatchCalls(selectedRows, length) {
    let test = arrayIds.reduce((rows, key, index) => (index % length == 0 
                ? rows.push([key]) 
                : rows[rows.length-1].push(key)) && rows, []);
    let Batchresults = []; //convert them to two dimensionl arrays of given length [[1,2,3,4,5], [6,7,8,9,10]]
    for (calls of test) {
            Batchresults.push(await Promise.all(calls.map((call)=>{
                fetch(`https://jsonplaceholder.typicode.com/posts/${call}`) 
                })
            ));
    }
return Promise.all(Batchresults); //wait for all batch calls to finish
}

上面的解决方案很好,但是有一个问题,

  1. 从网格中选择5条以上的行,然后点击批量操作按钮,
  2. 再次选择5行以上,然后点击批量操作按钮,
  3. 现在,我看到一次有10个请求处于活动状态。

我该如何限制呢?

在React中询问这里提到的问题的后续问题-在复杂的应用程序中智能地控制异步调用而没有任何副作用

这个问题是JavaScript,React的后续问题-同时发送多个ajax调用


问题答案:

async模块具有以下功能:async.queue。首先,您定义任务功能。然后给它一个任务-
对于您的情况,是一个行数组和您希望它执行的操作。该任务将运行,或者如果已有任务在执行中,则添加到队列中。任务完成后,下一个将从队列中取出。

更好的是,您可以只为一行定义任务功能,并将队列的并发性设置为5。当用户单击按钮时,您会向队列添加很多任务,每选择一个行都会添加一个任务。5个任务将立即开始运行,其余的将排队。这可能比您尝试做的要好,因为这样用户可以启动2个任务,然后立即启动另外3个任务,它们将并行运行。

尝试以下代码:

const async = require('async');    // or whatever mechanism you're using for module management.

const queue = async.queue((row, callback) => {
    fetch(`https://jsonplaceholder.typicode.com/posts/${call}`)
        .then(callback, callback);
}, 5);

function onGridRowsSelection(selectedRows) {
    for (let call of selectedRows) {
        queue.push(call);
    }
}


 类似资料:
  • 问题内容: 我想在click事件中进行三个Ajax调用。每个ajax调用都会执行不同的操作,并返回最终回调所需的数据。调用本身并不相互依赖,它们可以同时进行,但是当三个都完成时,我希望有一个最终的回调。 问题答案: 这是我写的一个回调对象,您可以设置单个回调以在全部完成后触发,也可以让每个回调都有自己的回调并在全部完成后触发它们: 注意 从jQuery 1.5+开始,您可以按照另一个答案中所述使用

  • 我调用了多个ajax调用,但代码只在所有ajax调用执行之后才到达API。 JavaScript: AppFactory API 链接工作很好,但我需要运行两个独立,我真的想知道发生了什么。 谢谢!!!

  • 我有几个函数,我根据ajax调用中的列表填充下拉列表: 现在,在下拉列表被填充后,我想选择一个特定的项目,但要获得这个项目,我需要另一个ajax,如: 主要功能基本上是: 问题是,在< code>fillUpdateDropDown完成之前,已经到达了< code>getDefaultDetails的< code>success回调(dropdowns可能有很多项)。 我试图理解回调,但在我的情况

  • 我正在使用Spring Boot微服务,并致电下游获取数据。 要求从多个下游获取数据,并将响应聚合为单个响应。 有人可以帮助我如何在Get请求中进行并行rest调用吗。 下面是我可以一个接一个地调用that的简单方法。但是,我正在寻找并行调用。 请协助。谢谢

  • 问题内容: 我看了以前发布的jQuery / MVC问题,但没有找到可行的答案。 我有以下JavaScript代码: 调用网址时,帖子看起来像: 有人可以向我解释为什么它会这样返回它(背后的逻辑)并为我提供有效的解决方案。提前致谢! PS:其他信息:%22是<<“ >>字符的URL编码参考 问题答案: 为了使其正常工作,必须将Javascript置于Razor视图中,以便该行 由Razor解析并替