我在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返回promise对象.使用$q而不是$.Deferred工作方式相同.
在我的实际代码中,我在第一次调用函数时创建了promise,所以我不能只是预先做出承诺并在范围内引用它.
我还需要它不仅仅是ng-bind,所以制作我自己的绑定指令来正确处理这种情况是不可行的.
有人有主意吗?如果数据没有得到解决,我现在正在返回承诺,如果有数据,我正在返回实际结果,但这很难处理.任何与数据绑定的内容都会在加载数据时短暂地产生奇怪的副作用,例如使用promise对象而不是使用已解析的值创建元素的ngRepeat.
谢谢.
更新:拉请求:https://github.com/angular/angular.js/pull/3605
更新2:为了将来参考,自动承诺展开已在1.2 brach中弃用.
解决方法
对于某些事情,我使用$resource.如果我需要等待它,$然后效果很好:
var r = $resource...get... var p = r.$then...
否则,我构建自己的资源类对象,这不是一个承诺,但有一个我可以等待的承诺.