簡體   English   中英

Promise.all使Jest顯示UnhandledPromiseRejectionWarning

[英]Promise.all causes Jest to display UnhandledPromiseRejectionWarning

我有一些代碼稱為Promise.all。 它在瀏覽器中運行正常,控制台中沒有警告。

有3個函數f1,f2和f3,所有函數都返回一個Promise。 代碼看起來像這樣

Promise.all([
  f1(),
  f2(),
  f3()
]).then((values) => {
  resolve({success: true})
}).catch(err => {
  reject(err)
})

當我使用Jest測試包含以上代碼的文件時,我看到此錯誤。

(節點:17177)UnhandledPromiseRejectionWarning:未處理的承諾拒絕。 引發此錯誤的原因可能是拋出了一個沒有catch塊的異步函數,或者是拒絕了一個.catch()無法處理的承諾。 (拒絕ID:18)

這是編寫上述代碼的錯誤方法還是Jest中的錯誤?

這是我正在使用的實際代碼:

getDataFromDatabase() {
  return new Promise((resolve, reject) => {
    const assessmentUrl = `${this.assessmentUrl}`
    http.get(assessmentUrl).then(response => {
      if (response.data.record === null) {
        Promise.all([
          this._getPupilPlacement(),
          this._getSurveyQuestions(),
          this._getCompetencies()
        ]).then((values) => {
          successState.pupilPlacement = values[0].pupilPlacement
          successState.items = values[1].items
          successState.formid = values[2].formid
          successState.competencies = values[3].competencies
          const panels = this.getPanels(values[3].competencies)
          successState.panels = panels
          successState.numPages = panels.length
          successState.itemsAreOverridden = true
          resolve(successState)
        }).catch(err => {
          reject(err)
        })

      }
      else {
        resolve(response.data.record)
      }
    })
  })
}

避免Promise構造函數反模式 您忘記了處理http.get(assessmentUrl)承諾中的錯誤。

你應該寫

getDataFromDatabase() {
  const assessmentUrl = `${this.assessmentUrl}`
  return http.get(assessmentUrl).then(response => {
//^^^^^^
    if (response.data.record !== null)
      return response.data.record;
    return Promise.all([
//  ^^^^^^
      this._getPupilPlacement(),
      this._getSurveyQuestions(),
      this._getCompetencies()
    ]).then(values => {
      const panels = this.getPanels(values[3].competencies)
      return {
//    ^^^^^^
        pupilPlacement: values[0].pupilPlacement,
        items: values[1].items,
        formid: values[2].formid,
        competencies: values[3].competencies,
        panels: panels,
        numPages: panels.length,
        itemsAreOverridden: true,
      };
    });
  });
}

說明:

調用reject將引發錯誤。 如果您的最高承諾沒有兌現,那么這是未解決的承諾。

承諾圖片說明 MDN圖片src

解:

getDataFromDatabase().catch(err=>console.lor(err.message));

拒絕的承諾示例:

 function getDataFromDatabase(){ return Promise.reject(123); } getDataFromDatabase() .then(data=>console.log("Success " + data)) .catch(err=>console.log("Error " + err)); 

Promise MDN doc

未來建議:

對於每個孩子,您似乎都會添加.catch() 只要在更高的位置有一個catch ,那么promise就會被promise

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM