[英]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.