Javascript Promise.all使Jest显示未处理的PromisejectionWarning

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。它在浏览器中正常运行,在控制台中没有警告

有3个函数f1、f2和f3,它们都返回一个承诺。代码如下所示

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,
      };
    });
  });
}