什么是等待Promise.All并提供额外数据的良好设计模式?

时间:2019-01-03 07:33:33

标签: node.js promise async-await

我想要一些有关将数据与诺言数组一起传递的好方法的指导,以便以后调用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;
}

1 个答案:

答案 0 :(得分:0)

您经常会在nodeJs中遇到这种问题,答案是您希望异步函数如何反应。

  1. 如果您希望它按顺序运行,则无需全部承诺。代码将如下所示。

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;
}

  1. 如果必须使用promise all,则可以使用另一个变量来保存值,这将使代码更少混乱。

	const results = await Promise.all(promises)).values();
	for (const result of results) {
		outputs.push({
			data: datas.shift(),
			result: result
		});
	}