异步等待句柄 Promise <Pending> Express API

Posted

技术标签:

【中文标题】异步等待句柄 Promise <Pending> Express API【英文标题】: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 不,不要那样做。对象字面量不是一个承诺。 【参考方案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
);

【讨论】:

以上是关于异步等待句柄 Promise <Pending> Express API的主要内容,如果未能解决你的问题,请参考以下文章

Promise.all() 不等待异步进程

异步函数不等待Promise

当异步函数不应该返回 Promise 时,为啥我需要等待它?

从异步等待函数中获取 Bluebird Promise

返回一个等待的值返回一个 Promise? (es7 异步/等待)

在 go 函数中等待 js 异步函数(promise)