[英]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
將引發錯誤。 如果您的最高承諾沒有兌現,那么這是未解決的承諾。
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));
對於每個孩子,您似乎都會添加.catch()
。 只要在更高的位置有一個catch
,那么promise
就會被promise
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.