6

Mark Dalgleish 写了一篇关于如何在 AngularJS 视图中使用Promise 的不错的小文章。有些人在评论中问了这个问题,但马克没有回答他们(还)。因为我问的是同样的问题,所以我会在 StackOverflow 上提问以获得答案:

  1. 如果您在视图中使用承诺,我该如何处理“加载”/“等待”指示,因为它们是异步的?Promise 是否有类似“resolved”或“withinRequest”的属性?

  2. 我如何处理错误?通常它们会在第二个回调中出现,但如果我直接在视图中使用承诺,我不会处理这种情况。还有其他方法吗?

谢谢你。

4

1 回答 1

13

编辑:从角度 v1.2开始,默认情况下未激活视图中的承诺分辨率

视图中 promise 的自动解析起初看起来像是一个方便的工具,但它有许多限制需要仔细理解和评估。这种方法最大的问题是 AngularJS 会为 promise 添加回调,而我们几乎无法控制它。

回答您的问题:

1) 如前所述,最终将由 AngularJS 添加成功/错误回调,因此我们在这里没有太多控制权。您可以做的是将原始承诺包装成一个跟踪解决方案的自定义承诺。但是这种灵巧的整体目的是节省很少的击键。不,没有像“解决”这样的事情。简而言之 - 没有适用于所有承诺的通用机制来跟踪进度。如果您的承诺是$http基于 - 的,您可能会使用拦截器或pendingRequests属性来跟踪正在进行的请求。

2)你不能。再一次,AngularJS 在$parse服务中添加了一个处理程序,它看起来像这样:(请参阅此处promise.then(function(val) { promise.$$v = val; });的代码)。您可以看到只添加了一个成功回调,因此所有失败都将被忽略。

这些并不是视图中自动承诺解决方案的唯一限制。另一个问题是函数返回的 Promise 无法正确解析。例如,如果您要像这样重写一个示例:

myModule.controller('HelloCtrl', function($scope, HelloWorld) {

  $scope.messages = function() {
    return HelloWorld.getMessages();
  }
});

并尝试使用以下标记:

<li ng-repeat="message in messages()"></li>

事情会按预期进行,这可能会让人感到意外。

简而言之:虽然 Promise 的自动解析似乎是一个方便的捷径,但它有许多限制和不明显的行为。仔细评估这些并决定是否值得节省一些击键。

于 2013-06-24T14:07:38.050 回答