承诺捕获链



我有这样一个场景:

controller.ts

methodA(): void {
myServive.someMethod()
.then( () => console.log("then") )
.catch( e => {
console.log("catch");
});
}

service.ts

someMethod(): ng:IPromise<void> {
const deferred = this.$q.defer<void>();
return this.OtherService.otherMethod()
.catch ( e => {
deferred.reject(reason);
}
}

otherservice.ts

otherMethod(): ng.IPromise<any> {
return this.HttpService.get(url);
}

测试:

  • otherMethod (otherService.ts)从HttpService获取错误。
  • someemethod (service.ts)中的catch被执行。

为什么,在控制器中。如果,则Block是否已被执行?

如果之前的then(或catch)抛出错误,则catch被执行。如果没有错误,代码将执行下一个then语句。

所以你有这个代码:

methodA(): void {
myServive.someMethod()
.then( () => console.log("then") )
.catch( e => {
console.log("catch"); // No errors thrown, so the code will continue in the next then
});
}

可以在catch中抛出错误。代码将继续到下一个捕获:

methodA(): void {
myServive.someMethod()
.then( () => console.log("then") )
.catch( e => {
console.log("catch");
throw new Error(e) // Some error happened! The code will continue in the next catch
});
}

为什么,在控制器中。Ts, then块被执行了?

因为在service.ts

中捕获了错误并返回undefined如果你不打算在service.ts中处理任何错误,看起来你应该完全摆脱catch/defer。

编辑:如果你想在控制器中处理catch,那么只需从service.ts中删除所有的东西,然后让它做:

// service.ts
someMethod(): ng:IPromise<void> {
return this.OtherService.otherMethod()
}

如果你想处理service.tsAND中的catch在控制器中,然后重新抛出错误(或新错误):

// service.ts
someMethod(): ng:IPromise<void> {
const deferred = this.$q.defer<void>();
return this.OtherService.otherMethod()
.catch ( e => {
// you can either do:
// throw e
// which rethrows the same error (same as not having a catch in here at all)
// or you can handle the error and throw a new one like:
//
// ...some error handling code
// throw new Error('my new error');
});
}

无论你选择哪一个,你都不需要延期。

相关内容

  • 没有找到相关文章

最新更新