Ответ от модели не определен при использовании асинхронного водопада

1

Я пытаюсь вернуть данные в свой шаблон просмотра. Я использую async.waterfall для этого. Есть только одна проблема, результат из класса всегда undefined

контроллер:

Profile().then(response => {
    console.log(response);
});

модель:

module.exports = async function Profile() {
    let waterfall = await Async.waterfall([
        function(callback) {
            db.getOneWhere('users', 'username', global.req.params.username, ["username"]).then(result => {
                callback(null, result);
            });
        },
        function(arg1, callback) {
            db.getOneWhere('users', 'username', 'admin', ["username"]).then(result2 => {
                let ok = {
                    arg1,
                    result2
                }
                callback(null, ok);
            });
        }
    ], function (err, result) {
        let tmp = [];
        Object.keys(result).forEach(function(k) {
            tmp = [...tmp, ...result[k]];
        });

        return {'data': tmp};
    });

    return waterfall;
}

let waterfall всегда undefined поэтому ответ от Profile.then()... также не определен. Почему он не работает и как он может быть исправлен?

  • 0
    Вы имеете в виду это async.waterfall ? Если это так, то эта функция возвращает undefined поскольку она определена таким образом. await волшебным образом не преобразует основанную на обратном вызове функцию в функцию, которая возвращает обещание.
  • 0
    @ t.niese хорошо, спасибо за объяснение. Есть ли у вас какие-либо предложения о том, как я могу это исправить?
Теги:

1 ответ

2
Лучший ответ

Вы бы Async.waterfall в Promise обратный вызов водопада тогда будет только отклонять/разрешать обещание. Созданное обещание затем разрешится с результатом водопада или будет отклонено, если произошла ошибка.

module.exports = async function Profile() {
  let result = await new Promise((resolve, reject) => {
    Async.waterfall([ /*....*/ ], (err, result) => {
      if (err) {
        reject(err)
      } else {
        resolve(result)
      }
    })
  })

  let tmp = [];
  Object.keys(result).forEach(function(k) {
    tmp = [...tmp, ...result[k]];
  });

  return {
    'data': tmp
  };
}
  • 0
    Спасибо, я узнал что-то новое сегодня :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню