Почему результат await / async не определен? - PullRequest
0 голосов
/ 17 мая 2018

У меня есть маршрут как:

router.get("/my_resource", myController.getResult);

Тогда мой контроллер выглядит так:

getResult: async (req, res, next) => {
    try {
      const param = req.query.param;
      let response = {};
      if (param) {
        let [result1, result2] = await Promise.all([myModel.getResult1(param), myModel.getResult2(param)]);
        console.log(result1);
        console.log(result2);
      }
      res.send(response);
    } catch (e) { 
        next(e);
    }
  }

И моя модель (которая запрашивает mongodb) выглядит так:

getResult1: (param) => {
    new Promise((resolve, reject) => {
      MongoSchema1.findById(param, (error, result) => {
        if (error) return reject(error);
        resolve(result ? result : {});
      }).select("field1 field2");
    })
  }

getResult2: (param) => {
  new Promise((resolve, reject) => {
    MongoSchema2.findById(param, (error, result) => {
      if (error) return reject(error);
      resolve(result ? result : {});
    }).select("field1 field2");
  })
}

Здесь, когда я пытаюсь console.log() в модельных функциях, я вижу, что результат не undefined. Я получаю правильный результат. Однако я вижу, что console.log() в методе контроллера выполняется раньше, чем console.log() в методах модели.

В приведенном выше коде я выполняю асинхронные вызовы параллельно с Promise.all(). Однако, даже если я пытаюсь запустить по одному, я все равно получаю неопределенный результат в методе контроллера. Что я делаю неправильно? Нужно ли импортировать какой-либо модуль, прежде чем я смогу await? Благодаря.

1 Ответ

0 голосов
/ 17 мая 2018

Проблема в том, что ваши методы getResult1 и getResult2 не возвращают Promises объекты.

Заменить

  getResult1: (param) => {
    new Promise((resolve, reject) => {
      MongoSchema1.findById(param, (error, result) => {
        if (error) return reject(error);

        resolve(result ? result : {});
      }).select("field1 field2");
    })
  }

К

  getResult1: (param) => {
    return new Promise((resolve, reject) => {
      MongoSchema1.findById(param, (error, result) => {
        if (error) return reject(error);
        resolve(result ? result : {});
      }).select("field1 field2");
    });
  }

Или

  getResult1: param => new Promise((resolve, reject) => {
      MongoSchema1.findById(param, (error, result) => {
        if (error) return reject(error);

        resolve(result ? result : {});
      }).select("field1 field2"));
  }

Или

getResult1: async param => (await MongoSchema1.findById(param).select('field1 field2')) || {};

Или

getResult1: async param => (await MongoSchema1.findById(param, 'field1 field2')) || {};
...