Javascript Promise.all使Jest显示未处理的PromisejectionWarning
我有一些代码叫做Promise.all。它在浏览器中正常运行,在控制台中没有警告 有3个函数f1、f2和f3,它们都返回一个承诺。代码如下所示Javascript Promise.all使Jest显示未处理的PromisejectionWarning,javascript,Javascript,我有一些代码叫做Promise.all。它在浏览器中正常运行,在控制台中没有警告 有3个函数f1、f2和f3,它们都返回一个承诺。代码如下所示 Promise.all([ f1(), f2(), f3() ]).then((values) => { resolve({success: true}) }).catch(err => { reject(err) }) 当我使用Jest测试包含上述代码的文件时,我看到了这个错误 (节点:17177)未处理的Promis
Promise.all([
f1(),
f2(),
f3()
]).then((values) => {
resolve({success: true})
}).catch(err => {
reject(err)
})
当我使用Jest测试包含上述代码的文件时,我看到了这个错误
(节点:17177)未处理的PromisejectionWarning:未处理的承诺拒绝。此错误源于在没有catch块的异步函数中抛出,或者拒绝未使用.catch()处理的承诺。(拒绝id:18)
这是编写上述代码的错误方法还是玩笑中的错误
以下是我正在使用的实际代码:
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)
}
})
})
}
说明:
调用reject
将抛出错误。如果你的最高承诺没有实现,那么这是一个未经处理的承诺
解决方案:
拒绝承诺的示例:
函数getDataFromDatabase(){
返还承诺。拒绝(123);
}
getDataFromDatabase()
.then(data=>console.log(“Success”+data))
.catch(err=>console.log(“Error”+err))代码>避免错误!您忘记了处理http.get(assessmentUrl)promise中的错误
你应该写信
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,
};
});
});
}
您的
解决
和拒绝
是来自承诺的回调。该承诺是否有一个.catch()
?@kemicofa是-该代码在一个函数中调用,该函数本身返回一个承诺,因此调用解析和拒绝。你可以共享整个函数吗?@kemicofa-我刚刚发布了上面的完整代码。你也可以共享测试代码吗?很可能您没有在测试用例中.catch()
拒绝
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,
};
});
});
}