2014-01-11 105 views
1

更新:我挖得更深一點,發現在1.2.0之後的角度已棄用auto-unwrapping of promisesAngular JS承諾評估

我知道Angular JS會評估作爲承諾的範圍變量,然後在履行承諾時更新控制器的視圖。

我的問題是:

http://jsfiddle.net/dhruvkaran/Lv5vF/4/

<div ng-app="myApp"> 
    <div ng-controller="DemoController"> 
    {{foo}} 
    </div> 
</div> 

<script> 
    var myApp = angular.module("myApp", []); 

    myApp.controller('DemoController', function($scope) { 
    $scope.foo = "bar"; 
    }); 
</script> 

作品就好了,但是,

http://jsfiddle.net/dhruvkaran/Lv5vF/5/

<div ng-app="myApp"> 
    <div ng-controller="DemoController"> 
    {{foo}} 
    </div> 
</div> 

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

    myApp.controller('DemoController', function($scope, $q) { 
    var deferred = $q.defer(); 
    deferred.resolve("bar"); 
    $scope.foo = deferred.promise; 
    }); 
</script> 

沒有。

我在這裏做錯了什麼?

回答

3

您錯誤地使用了承諾。承諾是未來某個時候將會實現的承諾,或者被解決或被拒絕。另外:範圍變量不一定是一個承諾,所以這可能是你感到困惑的地方。要正確使用的承諾,則需要使用承諾的「那麼」功能添加回調:

myApp.controller('DemoController', function($scope, $q) { 
    var deferred = $q.defer(); 
    deferred.resolve("bar"); 

    //Note: Promises are not normally resolved inline like above 
    deferred.promise.then(function (data) { 
    $scope.foo = data; 
    }); 

}); 
+0

在這種情況下它不會幫助,因爲函數註冊處理它之前承諾解決。 –

+0

您可以在任何回調註冊到承諾之前實際解決承諾。 OP的代碼jsfiddle:http://jsfiddle.net/Lv5vF/6/ – Patrick

+0

很高興知道謝謝! –