Angular promises:从then(...)语句中触发catch(...)?

时间:2015-06-18 23:05:48

标签: angularjs promise angular-promise

是否可以在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 (...)

1 个答案:

答案 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)中,不会抛出投掷和拒绝之间的区别。