4

我在 AngularJS github 上发布了一个问题,但它似乎并没有引起很多关注,而且我自己也无法修复它,因为它是一个非常低级的问题,所以我认为是时候寻找一个解决方法。

Angular 允许你将一个 Promise(或任何带有.then(...)函数的东西)放入你的作用域,一旦它被解析,所有的 $watches 和任何绑定到该 Promise 的东西都将使用解析后的值。当您使用函数返回承诺时会出现问题,因为同样不适用 - 它像普通对象一样处理。

例如:

var helloDef = $.Deferred();
$scope.hello = helloDef.promise();

$scope.getHello = function() {
    return $scope.hello;
};

$timeout(function() {
    helloDef.resolve('Hello!');
}, 1000);

小提琴

在这里使用ng-bind="hello"工作正常并输出你好!,但ng-bind="getHello()"输出[object Object]作为内部 $watch 返回承诺对象。与 $q 而不是 $.Deferred 的工作方式相同。

在我的实际代码中,我是在第一次调用函数时创建承诺,所以我不能只预先做出承诺并在范围内引用它。

我还需要它不仅仅是 ng-bind,所以制作我自己的绑定指令来正确处理这种情况是不可行的。

有人有想法么?如果数据尚未解决,我目前正在返回承诺,如果已解决,则返回实际结果,但使用起来很痛苦。任何绑定到数据的东西都会在加载数据时短暂地产生奇怪的副作用,比如 ngRepeat 使用 promise 对象而不是解析的值来创建元素。

谢谢。

更新:拉取请求:https ://github.com/angular/angular.js/pull/3605

更新 2:为了将来参考,自动承诺解包已在 1.2 分支中被弃用。

4

2 回答 2

1

对于某些事情,我使用 $resource。如果我需要等待它, $then 效果很好:

var r = $resource...get...
var p = r.$then...

否则,我构建自己的类资源对象,它不是一个承诺,但有一个我可以等待的承诺。

于 2013-08-13T04:33:22.397 回答
0

合并拉取请求,它应该在 1.2.0 中修复,所以我将其标记为答案。

于 2013-08-16T05:52:05.173 回答