asyn c: каждая функция никогда не завершается - PullRequest
1 голос
/ 18 июня 2020

Я пытаюсь использовать asyn c библиотеку для работы с двумерным массивом и обработки каждого сглаженного элемента. Примерно так:

import { each } from 'async';

let results: any[] = [];

await each(chats, async (chat) =>
    await each(chat.participants, async (participant) => {

        console.log('Before pause');
        // do something with participant
        results.push(fn(participant));
        await this.timeout(2500);
        console.log('After pause');

      })
);

console.log('Finished');

return results;

где

let chats = [
  {
    participants: ['1', '2']
  },
  {
    participants: ['3', '4']
  }
]

timeout(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

Однако console.log('Finished') никогда не выполняется. Я пробовал множество вариантов async и await в этом коде, но не могу заставить его работать. У меня есть рабочая версия с использованием чистого async / await, но я хотел бы использовать библиотеку asyn c.

Что я делаю не так?

Обратите внимание, что у меня это работает с использованием async / await без использования библиотеки asyn c, например:

await Promise.all(chats.map(
  async (chat) =>
    await Promise.all(chat.participants
      .map(async (participant) => {

        console.log('Before pause');
        // do something with participant
        results.push(fn(participant));
        await this.timeout(2500);
        console.log('After pause');

      })
    )
));

return results;

Но я хотел бы использовать библиотеку asyn c, потому что я хочу использовать другие функции из этой библиотеки.

Ответы [ 2 ]

1 голос
/ 18 июня 2020

Второй аргумент each() принимает форму: function(item, callback) {}, а callback необходимо вызывать при каждой итерации. Обратите внимание, что это не то же самое callback, что и необязательный третий аргумент each().

Решение состоит в том, чтобы вызывать обратные вызовы для каждой итерации, как показано ниже:

await each(chats, async (chat, done1 /*1️⃣*/) => {

  await each(chat.participants, async (participant, done2 /*2️⃣*/) => {
    //...
    done2(); /*3️⃣*/
  });

  done1(); /*4️⃣*/
});

console.log("Finished");

демо

0 голосов
/ 18 июня 2020

Попробуйте это

let chats = [
  {
    participants: ['1', '2']
  },
  {
    participants: ['3', '4']
  }
]


chats.forEach(chat =>
     chat.participants.forEach(async (participant) => {

        console.log('Before pause');
        // do something with participant
        await timeout(2500);
        console.log('After pause');
        console.log(participant)

      }));

function timeout(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}
console.log('Finished');

Проблемы: -

  • await работает только в asyn c function
  • Вместо this.timeout используйте с некоторыми контекст или прямо в вашем случае. Узнайте больше о поведении этого в js здесь и здесь
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...