Angular JS:链接承诺和摘要周期

Kar*_*les 15 promise angularjs

注意:小提琴使用旧版本的Angular,并且它不再起作用,因为从1.2开始,Angular模板引擎不会透明地处理promises.

我正在寻找链接承诺来填充我的范围,然后让范围自动更新dom.

我遇到了这方面的问题.如果我在已经解决的承诺上调用"then",它会创建一个新的承诺(它将异步调用成功函数,但几乎立即调用).我认为问题是我们已经在调用成功函数时离开了摘要周期,所以dom永远不会更新.

这是代码:

<div ng-controller="MyCtrl">
    Hello, {{name}}! <br/>
    {{name2}}<br/>
    <button ng-click="go()">Clickme</button><br/>
    {{name3}}
</div>

var myApp = angular.module('myApp',[]);

function MyCtrl($scope, $q) {
    var data = $q.defer();    
    setTimeout(function() {$scope.$apply(data.resolve("Some Data"))}, 2000);
    var p = data.promise;

    $scope.name = p.then(angular.uppercase);
    $scope.name2 = p.then(function(x) { return "Hi "+x;});
    $scope.go = function() {
            $scope.name3 = p.then(function(x) { 
                // uncomment this to make it work:
                //$scope.$apply();
                return "Finally: "+x;
            });
    };
 }
Run Code Online (Sandbox Code Playgroud)

http://jsfiddle.net/QZM4d/

是否有某种方法可以在每次连接承诺时都不用调用$ apply来完成这项工作?

Mar*_*cok 15

注意:小提琴使用旧版本的Angular,并且它不再起作用,因为从1.2开始,Angular模板引擎不会透明地处理promises.

引用 @ pkozlowski.opensource:

在AngularJS中,承诺解析的结果在$ digest循环内异步传播.因此,只有在进入$ digest循环时才会调用then()注册的回调.

因此,当单击按钮时,我们处于摘要周期.then()创建一个新的promise,但then()的结果将不会传播,直到下一个摘要周期,从未到来(因为没有$ timeout,或$ http,或DOM事件触发一个).如果你添加另一个没有任何操作的ng-click按钮,然后点击它,它将导致一个摘要周期,你会看到结果:

<button ng-click="">Force digest by clicking me</button><br/>
Run Code Online (Sandbox Code Playgroud)

这是一个小提琴,这样做.

小提琴也使用$ timeout而不是setTimeout - 然后不需要$ apply().

希望你需要使用$ apply时很清楚.有时您需要手动调用它.

  • 请注意,小提琴使用旧版本的Angular,并且它不再起作用,因为从1.2开始,Angular模板引擎不会透明地处理promises. (2认同)