JS:异步功能

时间:2020-02-19 11:31:01

标签: javascript node.js asynchronous promise async-await

我是JS的新手,异步功能存在一些问题。 我有一个函数,该函数从MongoDB返回数据。我创建了一个Promise,并使用空对象进行收集。

async function getRating(item, applicant) {
let arr = await Applicant.find({ proff: item }).sort({ ball: "desc" });
let rating = arr.findIndex(item => item._id.equals(applicant._id));
let spec = await Spec.findById(item);
const el = { spec, rating };
return el;}

router.get("/test", auth, async (req, res) => {
let applicant = await Applicant.findOne({ user: req.user.id });
let ratings = [];
applicant.proff.forEach(item => {
    const rating = getRating(item, applicant)
    .then(rating => ratings.push(rating))
    .catch(err => console.log(err));
     ratings.push(rating);
}); 
await res.json(ratings);
});

当我签入Postman时,这将返回一个数组:[{},{},{}]

请帮助。

3 个答案:

答案 0 :(得分:0)

这部分仍然是异步的,您必须使用await

 const rating = getRating(item, applicant).then(rating => ratings.push(rating)).catch(err....

答案 1 :(得分:0)

异步函数返回promise,因此您需要在getRating之前使用await。

答案 2 :(得分:0)

您可以尝试Promise.all

async function getRating(item, applicant) {
    let arr = await Applicant.find({ proff: item }).sort({ ball: 'desc' });
    let rating = arr.findIndex(item => item._id.equals(applicant._id));
    let spec = await Spec.findById(item);
    const el = { spec, rating };
    return el;
}

router.get('/test', auth, async (req, res) => {
    let applicant = await Applicant.findOne({ user: req.user.id });

    const ratingsPromise = applicant.proff.map(async item => {
        const rating = await getRating(item, applicant);
        return rating;
    });

    const ratings = await Promise.all(ratingsPromise);
    return res.json(ratings);
});