簡體   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