Итерация по массиву функций, где одни возвращают обещания, а другие нет - PullRequest
0 голосов
/ 29 февраля 2020

Я хотел бы знать, как лучше всего выполнить итерацию и выполнить массив функций, в которых некоторые возвращают обещания, и поэтому мы хотели бы использовать await, а большинство не возвращали обещания, поэтому мы устанавливаем их на async.

for (let i = 0; i < this.steps.length; i++) {
      request = await this.steps[i].run(request);
    }

Нам нужно, чтобы выполнение происходило последовательно, и поэтому мы используем await, потому что пара функций выполняет внешние HTTP-запросы, но другие функции уже работают синхронно, и поэтому нам не нужно ждать, но мы были вынуждены добавить асин c из них, чтобы мы могли написать приведенный выше код, который является обобщенным c.

Ответы [ 2 ]

0 голосов
/ 29 февраля 2020

Вы можете заключить вызов функции в Promise.resolve, чтобы гарантировать его асинхронность c, и использовать ожидание, не беспокоясь. Таким образом, вы просто измените одну строку на

request = await Promise.resolve(this.steps[i].run(request));

demo

(async () => {

  let steps = [
    {run: async (stuff) => new Promise(r => setTimeout(() => r("step 1"), 700))},
    {run: (stuff) => stuff + " step 2"},
    {run: async (stuff) => new Promise(r => setTimeout(() => r(stuff + " step 3"), 100))},
    {run: (stuff) => stuff + " step 4"},
    {run: async (stuff) => new Promise(r => setTimeout(() => r(stuff + " step 5"), 300))}
  ];

  let request = "";

  for (let i = 0, s; s = steps[i]; i++) {
    request = await Promise.resolve(s.run(request));
  }

  console.log(request);
  
})();
0 голосов
/ 29 февраля 2020

Если вы используете Node.js 10.x или выше, вы можете использовать util.types.isAsyncFunction(function foo() {});, чтобы проверить, является ли это асинхронной функцией. Если раньше, то вы можете использовать theFunc.constructor.name == 'AsyncFunction'

, тогда вы можете использовать троичный:

request = util.types.isAsyncFunction(this.steps[i].run) ? await this.steps[i].run(request) : this.steps[i].run(request)
...