我在AngularJS github上发布了an issue,但它似乎没有得到很多关注,我自己无法修复它,因为它是一个相当低级别的问题,所以我认为是时候寻找解决方法了。
Angular允许您将一个promise(或具有.then(...)
函数的任何东西)放入您的范围,一旦解析,所有$ watches和绑定到该promise的任何内容都将使用已解析的值。当您使用函数返回一个promise时会出现问题,因为它不适用 - 它像普通对象一样处理。
例如:
var helloDef = $.Deferred();
$scope.hello = helloDef.promise();
$scope.getHello = function() {
return $scope.hello;
};
$timeout(function() {
helloDef.resolve('Hello!');
}, 1000);
此处使用ng-bind="hello"
工作正常并输出 Hello!,但ng-bind="getHello()"
输出 [object Object] ,因为内部$ watch返回承诺宾语。使用$ q而不是$ .Deferred。
在我的实际代码中,我在第一次调用函数时创建了promise,所以我不能只是预先做出承诺并在范围内引用它。
我还需要它不仅仅是ng-bind,所以制作我自己的绑定指令来正确处理这种情况是不可行的。
有人有什么想法吗?如果数据没有得到解决,我现在正在返回承诺,如果有数据,我正在返回实际结果,但这很难处理。任何绑定到数据的东西都会在加载数据时短暂地产生奇怪的副作用,例如使用promise对象而不是使用已解析的值创建元素的ngRepeat。
感谢。
更新:拉取请求:https://github.com/angular/angular.js/pull/3605
更新2:为了将来参考,1.2 brach中已弃用自动承诺展开。
答案 0 :(得分:1)
对于某些事情,我使用$ resource。如果我需要等待它,那么$然后效果很好:
var r = $resource...get...
var p = r.$then...
否则,我构建了一个类似资源的对象,这个对象不是一个承诺,而是承诺我可以等待。
答案 1 :(得分:0)
Pull request合并后,应该在1.2.0中修复,所以我会将其标记为答案。