出于某种原因,当我从范围函数返回$q
承诺时,该值永远不会在分辨率上传播:
app.controller('MainCtrl', function($scope, $q) {
var deferred = $q.defer();
deferred.resolve("hello");
var promise = deferred.promise;
$scope.promiseReturn = function() {
return promise;
};
});
观点:
<body ng-controller="MainCtrl">
<p>promiseReturn: {{promiseReturn()}}</p>
</body>
Here's a Plunker for this code。该视图最终看起来像:
promiseReturn: {}
我的理解似乎是模板引擎会相当透明地处理$q
承诺。
答案 0 :(得分:4)
$q
承诺可以直接附加到范围,并且在解决后,它们的值将导致视图更新(并且将使用它们的已解析值),但它们不能是范围函数的返回值。
如果从作用域上的函数返回promise,则返回值按原样使用。 promise看起来像对象{then: function() { ... }}
,而Angular的JSON序列化器忽略了具有函数值的键,因此您只需在视图中获得{}
。 Here's a Plunker demonstrating this
Angular在几个地方处理这个问题;您可以在parse.js中找到一些内容(搜索.then
)。