繁体   English   中英

为什么我的异步 function 不等待 JavaScript 中的 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 NameTender Name都排在最前面。

await添加到match调用中应该会给出您期望的结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM