node.js - 用额外数据等待 Promise.all 的好的设计模式是什么
问题描述
我想要一些关于传递数据以及一系列承诺的好方法的指导,以便以后可以在调用await Promise.all()
.
我对 node 和promises
. 总而言之,下面的代码可以满足我的要求,但是promises array
将相应的data array
. 我认为这是一种常见的情况,并且会有一个更简单的解决方案。then()
通过将函数附加到,我能够完成相同的结果asyncFunc return
,但这会使代码更加混乱,并且由于某种原因需要两倍的时间来执行。
async function foo(inputs) {
var promises = [];
var datas = [];
for (var input of inputs.values()) {
promises.push(asyncFunc(input.a));
datas.push(input.b);
}
var outputs = [];
for (let result of (await Promise.all(promises)).values()) {
outputs.push({
data: datas.shift(),
result: result
});
}
return outputs;
}
解决方案
在 nodeJs 中你经常会遇到这种问题,答案是你希望你的 async 函数如何反应。
- 如果您希望它按顺序运行,则不需要全部承诺。代码将如下所示。
async function foo(inputs) {
const results = [];
const datas = [];
for (const input of inputs.values()) {
const result = await asyncFunc(input.a);
results.push(result);
datas.push(input.b);
}
const outputs = [];
for (const result of results) {
outputs.push({
data: datas.shift(),
result: result
});
}
return outputs;
}
- 如果您必须全部使用 Promise,您可以使用另一个变量来保存值,这将使代码不那么混乱。
const results = await Promise.all(promises)).values();
for (const result of results) {
outputs.push({
data: datas.shift(),
result: result
});
}
推荐阅读
- ajax - Laravel 在使用 ajax 时不更新值
- c - TCC 编译器:未定义符号“main”
- php - Laravel 模型关系不起作用
- python-3.x - 不同框架中的CheckButtons在python 3中一起激活
- python - 在 Python 中递归使用 dir() 来读取类或模块及其后代的层次结构
- javascript - 切换 BS 4.x 卡标题中的加减号
- javascript - 如何从 JS 中的异步操作中获取值?
- android - 膨胀类 android.support.design.bottomappbar.BottomAppBar 时出错
- python - 如何使用 python 更改子图中的 x 和 y 轴?
- apache-kafka - 错误:无法访问 jarfile /home/aK/.sbt/launchers/0/13.6/sbt-launcher.jar