繁体   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