首页 > 解决方案 > 用额外数据等待 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;
}

标签: node.jspromiseasync-await

解决方案


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

  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,您可以使用另一个变量来保存值,这将使代码不那么混乱。

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


推荐阅读