方法res.send()
返回(空),然后从方法
Skills.find({ skillbranch: branches[i]._id }, function (err, skills) {
如何在返回之前向其中添加等待或异步?
我正在学习节点/表达式,但无法在其他使用async
,await
,{{1 }}。
Promise
答案 0 :(得分:2)
类似的事情应该起作用。
在mongo通话中创建一个承诺。完成后,只需将其转换为数组,将其应用于分支技能,然后使用新的更新版本解决承诺即可。然后使用新的更新版本发送数据,而不是使用您一直在使用的全局branchSkills对象。
应该指出,我不确定您将使用分支技能做什么,但是您也许可以使用skills
来解决问题,而不必使用该全局数组?不过,这应该可以解决您的计时问题。
new Promise((resolve, reject) => {
Skills.find({ skillbranch: branches[i]._id }).toArray((err, skills) => {
if (err) {
reject(err);
} else {
branchSkills.push(skills);
resolve(branchSkills);
}
});
});
}).then(updatedBranchSkills => {
if (i == branches.length - 1) {
var obj = {
"status": "200",
"message": "skills",
"data": updatedBranchSkills
}
res.send(JSON.stringify(obj));
});
答案 1 :(得分:2)
您必须在res.send()
回调内部而不是外部调用Skills.find()
。但是,由于您要调用多个Skills.find()
,因此需要跟踪返回了多少个回调。为此,您可以使用变量:
// Keep track of completed find():
var completed = 0;
for (var i = 0; i < branches.length; i++) {
Skills.find({ skillbranch: branches[i]._id }, function (err, skills) {
console.log(JSON.stringify(skills));
completed++;
branchSkills.push(skills);
if (completed == branches.length) {
var obj = {
"status": "200",
"message": "skills",
"data": branchSkills
}
res.send(JSON.stringify(obj)); // INSIDE callback
}
}) // <--- note that callback ends here!
}