【问题标题】:What is a good design pattern for awaiting Promise.all with extra data用额外数据等待 Promise.all 的好的设计模式是什么
【发布时间】:2019-01-03 16:41:23
【问题描述】:

我想要一些关于传递数据以及一系列承诺的好方法的指导,以便在调用 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;
}

【问题讨论】:

  • (await Promise.all(promises)).map((result, i) => ({ data: datas[i], result })

标签: node.js promise async-await


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2021-08-02
    • 1970-01-01
    • 1970-01-01
    • 2013-07-01
    • 1970-01-01
    • 2014-03-28
    • 1970-01-01
    • 2023-03-26
    • 2019-06-26
    相关资源
    最近更新 更多