View 在AngularJS视图中使用承诺

View 在AngularJS视图中使用承诺,view,angularjs,promise,View,Angularjs,Promise,MarkDalgleish写了一篇关于如何在AngularJS视图中使用承诺的文章。 一些人在评论中对此提出了问题,但马克(现在)没有回答。因为我问的是同一个问题,所以我将在StackOverflow上提问,以获得答案: 如果在视图中使用承诺,我如何处理“加载”/“等待”指示,因为它们是异步的?承诺是否具有类似“已解决”或“无需”的属性 我如何处理错误?通常,它们会在第二次回调中出现,但如果我在视图中直接使用承诺,我不会处理这种情况。还有别的办法吗 谢谢。编辑:从angular v1.2开始 视

MarkDalgleish写了一篇关于如何在AngularJS视图中使用承诺的文章。 一些人在评论中对此提出了问题,但马克(现在)没有回答。因为我问的是同一个问题,所以我将在StackOverflow上提问,以获得答案:

  • 如果在视图中使用承诺,我如何处理“加载”/“等待”指示,因为它们是异步的?承诺是否具有类似“已解决”或“无需”的属性

  • 我如何处理错误?通常,它们会在第二次回调中出现,但如果我在视图中直接使用承诺,我不会处理这种情况。还有别的办法吗


  • 谢谢。

    编辑:从angular v1.2开始

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

    回答您的问题:

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

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


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

    myModule.controller('HelloCtrl', function($scope, HelloWorld) {
    
      $scope.messages = function() {
        return HelloWorld.getMessages();
      }
    });
    
    并尝试使用以下标记:

    <li ng-repeat="message in messages()"></li>
    
  • 事情会如预期的那样进行,这可能会让人感到意外


    简言之:虽然自动解决承诺似乎是一条方便的捷径,但它有许多限制和不明显的行为。仔细评估这些,并决定是否值得保存几次击键

    只要阅读angular官方文档中的$q,您的上述两个问题就会得到解答。编辑似乎在这里没有什么帮助,因为我不想以编程方式使用承诺,而是从问题/文章中描述的视图中使用承诺。这似乎不是文档的一部分。感谢您的深入回答。“函数返回的承诺不会正确解决”,但“事情会按预期进行”——这不是“不会”?;)