Javascript 循环中的承诺,循环后的代码不执行
我使用一个循环来查询事件,但是循环后的代码没有执行。为什么会这样?我该如何解决这个问题Javascript 循环中的承诺,循环后的代码不执行,javascript,promise,Javascript,Promise,我使用一个循环来查询事件,但是循环后的代码没有执行。为什么会这样?我该如何解决这个问题 router.post("/components/Pages/BrokerAPage/queryAll", (req, res) => { var requestedResult; for (i = 0; i < EventIDList.length; i++) { queryEvent(EventIDList[i]) .then((result) =&g
router.post("/components/Pages/BrokerAPage/queryAll", (req, res) => {
var requestedResult;
for (i = 0; i < EventIDList.length; i++) {
queryEvent(EventIDList[i])
.then((result) => {
if (result) {
requestedResult += result;
}
})
.catch(err =>
res.send(JSON.stringify({ status: 'error', message: err.message})));
}
console.log("*************TEST************")
console.log("*************"+requestedResult+"*************")
res.json(JSON.stringify(requestedResult));
});
您可以使用npm模块使循环同步
router.post("/components/Pages/BrokerAPage/queryAll", (req, res) => {
var requestedResult;
async.eachOf(EventIDList, function(EventId, index, acb) {
queryEvent(EventId)
.then((result) => {
if (result) {
requestedResult += result;
return acb(null);
}
})
.catch(err =>
res.send(JSON.stringify({ status: 'error', message: err.message})));
return acb(null);
}
});
但是queryEvent被多次激发?应该执行它,但requestedResult为空。这是一个异步问题。您必须等待所有对queryEvent的调用完成。否则,您可能会在requestedResult保存预期输出之前到达最后三行代码。for循环不同步。承诺返回后,打印requestedResult。其空原因承诺为resolve async。当输出requestedResult时,queryEvent承诺未完成。您应该将queryEvent存储在一个use Promise.all数组中
router.post("/components/Pages/BrokerAPage/queryAll", (req, res) => {
var requestedResult;
var promises = [];
EventIDList.forEach((EventID) => {
// gather all Promises
promises.push(queryEvent(EventID)
.then((result) => {
if (result) {
requestedResult += result;
}
}));
});
// wait till all promises are settled, then log result
Promise.all(promises).then(() => {
console.log("*************TEST************");
console.log("*************" + requestedResult + "*************");
res.json(JSON.stringify(requestedResult));
}).catch(err => res.send(JSON.stringify({
status: "error",
message: err.message
})));
});