【问题标题】:Why is the result of await/async undefined?为什么等待/异步的结果未定义?
【发布时间】:2018-10-27 10:40:58
【问题描述】:

我有这样的路线:

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 之前是否需要导入任何模块?谢谢。

【问题讨论】:

  • originalMailscrapeResult 来自哪里?你只声明 result1result2 但从不使用它们。此外,您的 response 始终是空对象。
  • @Bergi,抱歉 t 应该是 result1result2。我更新了问题。

标签: javascript express async-await


【解决方案1】:

问题是您的方法 getResult1getResult2 不返回 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')) || {};

【讨论】:

  • 非常感谢!我会在几分钟内接受答案,因为这里有锁。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-30
  • 1970-01-01
  • 2016-12-05
  • 2018-08-28
  • 1970-01-01
  • 2019-08-07
相关资源
最近更新 更多