为什么await/async的结果未定义?

swd*_*don 5 javascript express async-await

我有这样的路线:

router.get("/my_resource", myController.getResult);
Run Code Online (Sandbox Code Playgroud)

然后我的控制器是这样的:

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);
    }
  }
Run Code Online (Sandbox Code Playgroud)

我的模型(正在查询 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");
  })
}
Run Code Online (Sandbox Code Playgroud)

在这里,当我尝试console.log()在模型函数中时,我可以看到结果不是undefined。我得到了正确的结果。但是,我可以看到console.log()控制器方法在console.log()模型方法之前执行。

在上面的代码中,我与Promise.all(). 但是,即使我尝试一次运行一个,我的结果仍然在控制器方法中未定义。我究竟做错了什么?我需要先导入任何模块吗await?谢谢。

Gré*_*EUT 2

问题是你的方法getResult1getResult2返回Promises对象。

代替

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

        resolve(result ? result : {});
      }).select("field1 field2");
    })
  }
Run Code Online (Sandbox Code Playgroud)

经过

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

或者

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

        resolve(result ? result : {});
      }).select("field1 field2"));
  }
Run Code Online (Sandbox Code Playgroud)

或者

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

或者

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