Mark Dalgleish写了一篇关于如何在AngularJS视图中使用promises的nice little article。 有些人在评论中询问了这个问题,但马克没有回答(尚)。因为我问我同样的问题,我会在StackOverflow上请求得到答案:
如果在视图中使用promises,如何处理“加载”/“等待”指示,因为它们是异步的?承诺是否具有“已解决”或“内部请求”属性?
如何处理错误?通常它们会出现在第二个回调中,但是如果我在视图中直接使用promise,我就不会处理这种情况。还有其他办法吗?
谢谢。
答案 0 :(得分:13)
编辑:从角度v1.2开始resolution of promise in views is not activated by default。
视图中promises的自动解决方案起初看起来像一个方便的工具,但它有许多需要仔细理解和评估的限制。这种方法最大的问题是AngularJS会为一个承诺添加回调,而我们几乎无法控制它。
回答你的问题:
1)如上所述,最终AngularJS将添加成功/错误回调,因此我们在这里没有太多控制权。你可以做的是将原始承诺包装成一个跟踪分辨率的自定义承诺。但这种方法可以解决保存少量键击的全部目的。不,没有“解决”之类的东西。简而言之 - 没有通用的机制可以跟踪适用于所有承诺的进展。如果您的承诺是基于$http
- 您可以使用拦截器或pendingRequests
属性来跟踪正在进行的请求。
2)你不能。再一次,AngularJS在$parse
服务中添加了一个处理程序,它看起来像这样:promise.then(function(val) { promise.$$v = val; });
(参见代码here)。您可以看到只添加了成功回调,因此将无声地忽略所有失败。
这些不是视图中自动承诺解析的唯一限制。另一个问题是函数返回的promise将无法正确解析。例如,如果您要重写如下示例:
myModule.controller('HelloCtrl', function($scope, HelloWorld) {
$scope.messages = function() {
return HelloWorld.getMessages();
}
});
并尝试使用以下标记:
<li ng-repeat="message in messages()"></li>
事情会按预期发挥作用,这可能会让人感到意外。
简而言之:虽然承诺的自动解决可能看起来像一个方便的捷径,但它有许多限制和非显而易见的行为。仔细评估这些并确定是否值得保存几次击键。