Использование нескольких ожидающих на карте - PullRequest
1 голос
/ 07 января 2020

Я немного запутался из-за кода ниже.

 let bookingID
 result = await Promise.all(result.map(async (item) => {
      bookingID = item.id;
      console.log('###############################');
      AData = await book.fetchA(bookingID);
      console.log(bookingID);
      BData = await book.fetchB(bookingID);
      console.log('==============================');

      return {
        'AData ': AData ,
        'BData ': BData ,
        'id': bookingID
      };
  }));

В консоли я получаю следующее: (ПРИМЕЧАНИЕ. Идентификатор одинаковый. Всегда последний)

###############################
###############################
2918849262429175808
2918849262429175808
==============================
==============================

Кажется, что-то не так с l oop logi c, результат должен был быть

###############################
2918849262429175807
==============================
###############################
2918849262429175808
==============================

Но если я изменю последовательность console.log на

      console.log('###############################');
      console.log(bookingID);
      AData = await book.fetchA(bookingID);
      BData = await book.fetchB(bookingID);
      console.log('==============================');

вывод (ПРИМЕЧАНИЕ. Идентификатор отличается)

###############################
2918849262429175807
###############################
2918849262429175808
==============================
==============================

Я полностью сбит с толку. 8- (

Просто найди интересную вещь. Когда я использую console.log (item.id) вместо console.log (bookingID), он может получить правильный результат id. Что происходит с 'bookingID = item.id'? Почему он всегда получает один и тот же идентификатор, когда console.log (bookingID) находится после AData = await book.fetchA (bookingID)?

1 Ответ

0 голосов
/ 07 января 2020

Даже если Node.js является однопоточным, Promise.all не блокируется, если один Promise ожидает результата, поэтому, когда первое обещание ожидает AData = await book.fetchA(bookingID);, другое обещание продолжает вызывать console.log и ждет снова, так что конечный результат is

###############################
###############################
2918849262429175808
2918849262429175808
==============================
==============================

Аналогичный аргумент может быть сделан для второго случая. При вызове на Promise.all

сохраняется только порядок возвращаемого значения
...