Hus*_*ser 8 javascript rest promise
我有一个函数可以对服务进行 REST 调用并返回一个承诺。让我们调用该函数 Execute()。该函数采用 ID 并将 ID 作为 GET 参数发送到 REST 端点,该端点将 ID 与一些附加信息一起保存在 mongoDB 数据库中。
在客户端中,我需要从 ID(0 到 100k)运行“执行”100k 次,并显示每个 ID 的状态(成功还是失败)。
我做了显而易见的事情,我创建了一个从 0 到 100k 的循环并运行执行传递“i。这导致我的 Chrome 最终冻结内存不足(资源不足)。它还导致后面所有其余调用的网络拥塞结尾。
所以我想把这 100k 切成可管理的数量,就像每个 50 个 Promise 调用一样。当这 50 个都完成时(无论失败还是成功),我想使用Promise.all([])。然后执行下一个 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))
}
}
Run Code Online (Sandbox Code Playgroud)
Javascript 的异步特性将继续执行循环的其余部分并执行。我真的不想设置一个计时器来每 50 次迭代保持一次循环,因为这会阻塞 UI 并导致我的应用程序同步。关于我如何解决这个问题有什么建议吗?
非常感谢。
JavaScript 新手。
对于承诺本身,这只能通过递归来完成。
如果您可以使用新版本的 Node.js,使用 async wait,它将按您的预期工作,然后您可以使用await Promise.all(promises)
如果你不能,那么有一个很好的库(称为Async)可以使用此方法一次执行 50 个异步调用:https://caolan.github.io/async/v3/docs.html#parallelLimit
它甚至比块更好,因为如果块中有 1 个缓慢的回调,它将阻止其他所有内容。由于并行限制,它只会一直执行 50 个回调。(但是,如果您坚持使用 .series 方法,则可以预先创建 50 个块)
| 归档时间: |
|
| 查看次数: |
13433 次 |
| 最近记录: |