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

标签 javascript express async-await

我有这样一条路线:

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

然后我的 Controller 就像:

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。我得到正确的结果。但是,我可以看到 Controller 方法中的 console.log() 在模型方法中的 console.log() 之前执行。

在上面的代码中,我正在与 Promise.all() 并行进行异步调用。但是,即使我尝试一次运行一个,我仍然会在 Controller 方法中得到未定义的结果。我究竟做错了什么?在我可以 await 之前是否需要导入任何模块?谢谢。

最佳答案

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

关于javascript - 为什么 await/async 的结果未定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50386755/

相关文章:

c# - 在等待时,当控制权转到调用者时,它是否处理 for 循环的下一次迭代(等待返回任务吗?)?

javascript - 将混合数据类型数组从 php 传递到 javascript 数组

javascript - 如何检查函数是否在 Node 的工作线程中运行?

javascript - html 输入字段限制为手机上的数字

javascript - cookie 中未设置 token

c# - 在 C# 中使用异步方法进行消息循环

javascript - 计算复选框被选中的次数

angularjs - 减轻对静态 Assets 的 Node/快速请求中反射(reflect)的 XSS

javascript - React 路由器未在重定向上加载组件

c# - 使用 LINQ ForEach() 异步等待