是否可以在catch(...)
部分内触发承诺链的then(...)
部分?
例如,我发出$ http请求并链接一些行为。 $ http成功解析,但在处理数据时,很明显数据更适合于错误情况,所以我们想要激活错误处理程序。
问题是 - 我已经在两个地方使用了这个承诺链;一个在服务本身内,另一个在控制器中激活服务。控制器是处理promise链的catch(...)
部分的控制器,它打开一个显示错误消息的模式。
到目前为止,我已经能够将承诺链接起来,只要在服务中触发then(...)
或catch(...)
,我就可以返回结果,然后它就会在控制器内触发 - 正如预期的那样。
但是如何在服务中触发then(...)
,但是返回一个结果,以便在控制器内触发catch(...)
?
我尝试使用$q.reject(...)
来创建并返回一个新的承诺,作为then(...)
函数中的返回值,但这似乎无效。
示例:
var url = 'http://google.com';
$http.get(url).then(handleFirst).then(handleSecond).catch(error);
function handleFirst (response) {
console.log("HandleFirstCalled", response);
return response;
}
function handleSecond (response) {
console.log("HandleSecondCalled", response);
return response;
}
function error (response) {
console.log("ErrorCalled", response);
}
如何获得handleFirst(...)
,跳过执行handleSecond(...)
,然后执行error(...)
?注意:您无法致电error(response)
,因为无法从外部承诺链访问它。
[编辑:] 找到解决方案,return $q.reject(response);
确实有效。但是,服务catch(...)
功能必须始终return $q.reject(response)
。以前,我只有return response;
,它将由Controller承诺链继续。但是控制器会在其链中激活then(...)
。
所以return response;
就这样了:
Service -> $http -> then(...) -> catch(...) -> Controller -> then (...)
通过更改它return $q.reject(response);
:
Service -> $http -> then(...) -> catch(...) -> Controller -> catch (...)
答案 0 :(得分:2)
Angular中有两个选项可以拒绝来自当时的返回承诺。
throw new Error(...); // this will reject the promise and trigger $exceptionHandler
或者:
return $q.reject(new Error(...)); // this will reject the promise
使用第一个信号表示您无法真正从中恢复的错误,后者表示您可以从中恢复的错误。
请注意,在标准(ES6承诺)和其他合规承诺(如Bluebird)中,不会抛出投掷和拒绝之间的区别。