【问题标题】:Using Promises in AngularJS Views在 AngularJS 视图中使用 Promise
【发布时间】:2013-11-26 00:09:44
【问题描述】:

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

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

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

谢谢。

【问题讨论】:

  • 只需阅读有关 Angular 官方文档的 $q 内容,您的上述两个问题都会得到解答
  • #rtfm 似乎在这里没有帮助,因为我不想以编程方式使用承诺,而是从问题/文章中描述的视图中使用。这似乎不是文档的一部分。

标签: view angularjs promise


【解决方案1】:

编辑:从角度 v1.2 开始,resolution of promise in views is not activated by default

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

回答您的问题:

1) 如前所述,最终将由 AngularJS 添加成功/错误回调,因此我们在这里没有太多控制权。您可以做的是将原始承诺包装成一个跟踪解决方案的自定义承诺。但是这种灵巧的整体目的是节省很少的击键。不,没有像“解决”这样的事情。简而言之 - 没有适用于所有承诺的通用机制来跟踪进度。如果你的 Promise 是基于 $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>

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

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

【讨论】:

  • 感谢您的深入回答。
  • “函数返回的承诺将无法正确解决”,但“事情会按预期工作” - 这不应该是“不会”吗? ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多