![](/img/trans.png)
[英]JS async/await doesn't wait for my functions to resolve their promise
[英]Why my async function doesn't await to the Promise in JavaScript?
我的代码如下:
const match = async (tender, searchCriteria) => {
const tenderAccount = await tenderAccountController.findOrCreate(
tender,
searchCriteria,
);
if (searchCriteria.emailFrequency !== 'real-time') {
return null;
}
// Notify Stakeholders
await notifyStakeholders(tender, tenderAccount, searchCriteria);
};
这个 function “匹配”在 for 循环中被调用 [for (const searchCriteria of searchCriterias) {}]
findOrCreate function 如下:
exports.findOrCreate = async (tender, searchCriteria) => {
console.log("Search Criteria Name: " + searchCriteria.name)
console.log("Tender Name: " + tender.name)
// Check if it already exists
let doc = await TenderAccount.findOne({
tender: tender._id,
account: searchCriteria.account._id
})
console.log("Doc: " + doc)
if(doc) {
// If it exists, update searchCriterias
await TenderAccount.updateOne({ _id: doc._id }, { $addToSet: { searchCriterias: searchCriteria } })
return doc;
} else {
doc = await TenderAccount.create({
tender,
account: searchCriteria.account,
searchCriterias: [searchCriteria],
dueDate: tender.submissionDeadlineDate
})
return doc;
}
};
我的问题是它不等待 findOne 查询。 它只是完成所有初始循环(searchcriteria 循环),当循环结束时它返回查询结果。 在我的控制台中,我得到了这个:
Search Criteria Name: test-sc
Tender Name: test-tender
Search Criteria Name: test2-sc
Tender Name: test2-tender
Search Criteria Name: test3-sc
Tender Name: test3-tender
Doc: null
Doc: null
Doc: null
而且我不明白,它应该在招标名称 console.log 之后对文档进行 console.log,对吗?
我会很感激你的回答。
当您在不调用await
的情况下调用async
function 时,它将继续执行而无需等待 promise 被解析。 因此,如果您的 for 循环看起来像: for (...) match(...)
而不是for (...) await match(...)
,它将一个接一个地立即执行所有匹配,因此为什么Search Criteria Name
和Tender Name
都排在最前面。
将await
添加到match
调用中应该会给出您期望的结果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.