javascript - 在 50 个小块中用 Javascript 执行 10 万个 Promise

标签 javascript rest promise

我有一个函数可以对服务进行 REST 调用并返回一个 promise 。让我们调用该函数 Execute()。该函数接受一个 ID 并将 ID 作为 GET 参数发送到 REST 端点,该端点将 ID 保存在 mongoDB db 中,并带有一些附加信息。

在客户端中,我需要从 ID(0 到 100k)运行“执行”100k 次并显示每个 ID 的状态(成功还是失败)。

我做了很明显的事情,我创建了一个从 0 到 100k 的循环并运行执行传递“i。这导致我的 Chrome 最终卡住内存不足(资源不足)。它还导致后面的所有其余调用导致网络拥塞结尾。

所以我想把这 10 万个“砍”成可管理的数量,比如每个调用 50 个 promise 。当这 50 个都完成时(无论是失败还是成功),我想使用 Promise.all([]).then 执行接下来的 50 个,直到完成所有 100k。这样我可以同时控制网络拥塞和内存。但是我似乎不知道如何摆脱它。这是我的代码。

let promises = []
for (let i = 0; i < 100000, i++)
    {
       promises.push(execute(i))
       if (i % 50 === 0) 
       {
          Promise.all(promises)
          .then  (a => updateStatus (a, true))
          .catch (a => updateStatus (a, false)) 

       }

    }

Javascript 的异步特性将继续执行循环的其余部分并继续执行。我真的不想在每 50 次迭代中设置一个计时器来保持循环,因为这会阻塞 UI 并使我的应用程序同步。关于我如何解决这个问题的任何建议?

非常感谢您。

Javascript 新手。

最佳答案

您可以使用async/await要按顺序执行异步任务,安排对同一函数的调用是包含元素的原始数组,否则返回结果数组

let arr = Array.from({
  length: 2000
}, (_, i) => i);

let requests = arr.slice(0);

let results = [];

let fn = async(chunks, results) => {
  let curr;
  try {
    curr = await Promise.all(chunks.map(prop => 
             new Promise(resolve => setTimeout(resolve, 500, prop))));
    results.push(curr);
    console.log(curr);
  } catch(err) {
    throw err
  }

  return curr !== undefined && requests.length 
         ? fn(requests.splice(0, 50), results) 
         : results
}

fn(requests.splice(0, 50), results)
.then(data => console.log(data))
.catch(err => console.error(err))

关于javascript - 在 50 个小块中用 Javascript 执行 10 万个 Promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48345606/

相关文章:

angularjs - $resource 成功回调返回 $promise

safari - TransactionInactiveError : Failed to execute 'get' on 'IDBObjectStore' : The transaction is inactive or finished

javascript - PromiseRejectionEvent 是如何触发的?

javascript - 嵌入的 svg 何时实际加载,我如何检查它是否加载

javascript - 即使是最基本的 Javascript 对我来说也失败了 - 但为什么呢?

javascript - 使用带有嵌套拖拉古拉和切片的句柄

javascript - 面临切换类的问题

rest - Spring boot 和 Jira REST API 在 maven 中给出依赖错误

java - 如何使用 Jersey for java 在浏览器中呈现新的 .jsp 文件?

android - 如何等待 IntentService 完成其任务