Promise.all使Jest显示UnhandledPromiseRejectionWarning

时间:2019-02-22 11:46:28

标签: javascript

我有一些代码叫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)
      }
    })
  })
}

2 个答案:

答案 0 :(得分:2)

避免使用Promise constructor antipattern!您忘记了处理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,
      };
    });
  });
}

答案 1 :(得分:0)

说明:

调用reject将引发错误。如果您的最高承诺没有兑现,那么那是未解决的承诺。

promise image explanation MDN Image 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()。只要上方某处有catchpromise就会被处理。