节点承诺类之间的错误传播

时间:2017-12-04 22:46:43

标签: javascript node.js

我目前正处于面向代码对象的过程中,并且在类实例之间传播promise错误时遇到了问题。

Page.js:

exports.Page = class {
  constructor(link, limiter){
    this.link = link;
    //limiter is a instance of bottleneck, use it for rate limiting
    this.limiter = limiter;
  }

  setResults(){
    return new Request(this.link, this.limiter).makeRequest()
    .catch(err => {
      //i dont get here
      console.log(err);
    })
  }
}

(从另一个类调用并启动)

Request.js:

exports.Request = class {
  constructor(options, limiter){
    this.options = options;
    this.limiter = limiter;
  }

  makeRequest(){
    return this.limiter.schedule(this.request, this.options)
    .catch(err => {
      //i get here
      throw err;
    });
  }

  request(url){
    return rp("https://httpstat.us/500")
    .catch(err => {
      //i get here
      throw err;
    })
  }
}

所以我的问题是,错误不会传播回page.js,而是在控制台中打印出未处理的拒绝错误。我试过在没有limiter.schedule的情况下运行它,但它并没有什么区别。得到一些指点会很好,不能弄明白。

3 个答案:

答案 0 :(得分:1)

在异步函数中抛出错误时,在catch中抛出错误可能无法正常工作。用throw err;替换return Promise.reject(err);应该有效。

答案 1 :(得分:0)

.catch()方法用于处理Promises错误和拒绝。它会创建一个新的承诺,所以当你在其中使用throw时,你会创建另一个未处理的Promise错误。

问题是,您无法跟踪本机JS发生错误的位置。 您可以将Promise.longStackTraces用于Bluebird(库)承诺。或者像区域这样的东西。

答案 2 :(得分:-1)

传递给Promises的回调不返回值。期。完全停止。您将回调作为.then().catch()的单个参数传递,在运行时,它将永远不会返回值或抛出可捕获的错误,因为它没有返回的上下文或错误输出至。