我有这样一个场景:
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.ts
AND中的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');
});
}
无论你选择哪一个,你都不需要延期。