Задать вопрос

Как заполнить массив в node.js?

Подскажите, как мне заполнить массив arr в данном случае, просто он пустой у меня года вывожу результат, а AllScales выводится
async.series (
  [
    function (callback) {
      DB.GetAllScales().then((AllScales) => {
        arrAllScales = AllScales;
        callback (null, AllScales);
      })

    },
    function (callback) {
      var arr = [];
      var TypeScales = [];
      async.eachSeries (arrAllScales,  Scales => {
        var NameScales = Scales['Name'];
         DB.GetTypeScales(NameScales).then(ArrtypeScales => {
          var Obj = {};
          Obj.NameScales = NameScales;
          Obj.TypeScales = ArrtypeScales;
          arr.push(Obj);
          console.log(arr.length)
        })
      })
      callback (null, arr);
    },
  ],
  function (err, result) {
    console.log (result);
  }
);
  • Вопрос задан
  • 312 просмотров
Подписаться 1 Простой 3 комментария
Пригласить эксперта
Ответы на вопрос 1
@Interface
Судя по всему у вас смешаны промисы и библиотека async https://www.npmjs.com/package/async .
Согласен с shmatuan, что лучше всего было бы использвовать async/await. Если это невозможно советую переписать на что-то одно, либо callback'и, либо Promis'ы (лучше второе конечно).

Судя по коду проблема в том что колбэк в котором пополняется массив ассинхронный. Это значит что из внешней функции мы выйдем до его исполнения. А значит слудующий колбэк в async.series выполнится с пустым массивом.

Иван Жильников Вот это один из вариантов решения проблемы:
https://jsfiddle.net/int0h/17bojhfm/

То есть использование Promise.all

В конце есть решение на async / await, оно делает примерно то же что и ваше, но читается намного лучше и занимает 10 строк, а не 30. Спойлер, вот оно:
async function main() {
    const scales = await DB.GetAllScales();
    const result = await Promise.all(
        scales.map(async scale => ({
            TypeScales: await DB.GetTypeScales(scale.Name),
            NameScales: scale.Name
        }))
    );
  console.log('async / await result:', result);
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы