我是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时,这将返回一个数组:[{},{},{}]
请帮助。
答案 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);
});