我目前正处于面向代码对象的过程中,并且在类实例之间传播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的情况下运行它,但它并没有什么区别。得到一些指点会很好,不能弄明白。
答案 0 :(得分:1)
在异步函数中抛出错误时,在catch中抛出错误可能无法正常工作。用throw err;
替换return Promise.reject(err);
应该有效。
答案 1 :(得分:0)
.catch()
方法用于处理Promises错误和拒绝。它会创建一个新的承诺,所以当你在其中使用throw
时,你会创建另一个未处理的Promise错误。
问题是,您无法跟踪本机JS发生错误的位置。
您可以将Promise.longStackTraces
用于Bluebird(库)承诺。或者像区域这样的东西。
答案 2 :(得分:-1)
传递给Promises的回调不返回值。期。完全停止。您将回调作为.then()
或.catch()
的单个参数传递,在运行时,它将永远不会返回值或抛出可捕获的错误,因为它没有返回的上下文或错误输出至。