【问题标题】:Async await handle Promise { <Pending> } Express API异步等待句柄 Promise { <Pending> } Express API
【发布时间】:2021-03-17 15:13:55
【问题描述】:

我得到了这个 API 控制器:

exports.doctorsList = async (req, res) => {
    const users = await User.find().exec();
    let responseArray = await users.map(async (user) => {
        const transaction = await MedicalConsultation.find({
            doctorOwner: user._id,
        }).exec();

        let cpLength = transaction.length;

        return await {
            _id: user._id,
            name: user.name,
            email: user.email,
            specialty: user.specialty,
            role: user.role,
            createdAt: user.createdAt,
            c_p: cpLength,
            status: user.status,
        };
    });

    console.log(responseArray);
    res.json(responseArray);
};

在 console.log 中我得到了:

[ Promise { <pending> }, Promise { <pending> }, Promise 
{ <pending> } ]

编写该代码的正确方法是什么?或者如何获取值?

【问题讨论】:

  • 尝试将return await { ...改为return { ...
  • 完成! - 不起作用;(仍然是相同的结果...
  • 尝试删除前两个等待并只保留事务 = 等待 ....
  • 同样的结果,[ Promise { },Promise { },Promise { } ],
  • @pzaenger 不,不要那样做。对象字面量不是一个承诺。

标签: express mongoose promise async-await


【解决方案1】:

users.map(async function(){ ... }) 会产生一系列承诺,您需要在该承诺数组上使用await Promise.all(...)

所以而不是:

 let responseArray = await users.map(async (user) => {
   // your code goes here
 });

你需要:

 let responseArray = await Promise.all(users.map(async (user) => {
   // your code goes here
 }));

如果您使用的是 bluebird,您可以使用更好的 API。

const Promise = require('bluebird');

let responseArray = await Promise.map(users, async (user) => {
  // your code goes here
});

【讨论】:

    猜你喜欢
    • 2020-03-04
    • 2018-11-17
    • 1970-01-01
    • 1970-01-01
    • 2019-02-06
    • 2019-08-02
    • 1970-01-01
    • 2018-02-14
    • 1970-01-01
    相关资源
    最近更新 更多