我有一个函数可以对服务进行 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/