Что такое хороший шаблон дизайна для ожидания Promise.all с дополнительными данными - PullRequest
0 голосов
/ 03 января 2019

Я хотел бы получить несколько советов о том, как передать данные вместе с массивом обещаний, чтобы эти данные можно было использовать позже после вызова await Promise.all().

Я довольно новичок в узле и 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 голосов
/ 03 января 2019

Вы часто сталкиваетесь с подобной проблемой в 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. Если вам нужно использовать обещание все, вы можете использовать другую переменную для хранения значений, это сделает код менее запутанным.

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