6

考虑以下示例:

    .service('movieGetter', ['$q', '$timeout', function ($q, $timeout) {
    this.getData = function () {
        var deferred = $q.defer();
        $timeout(function(){
            mock.getData(function(data){
                deferred.resolve(data);
            });
        }, 2000);

        return deferred.promise;
    };
}]);

由于某种原因,此代码不起作用,当行 deferred.resolve() 触发回调时,控制器中的 then 不起作用

另一方面,这个例子工作正常:

    .service('movieGetter', ['$q', '$timeout', function ($q, $timeout) {
    this.getData = function () {
        var deferred = $q.defer();
        $timeout(function () {

            deferred.resolve('test');
        }, 2000);

        return deferred.promise;
    };
}]);

出于某种原因,当 deferred.resolve() 在回调内部触发时,控制器上的 then 回调不起作用。

有任何想法吗?

谢谢!

4

1 回答 1

14

看起来,angular 中的 promise API 是范围的一部分,因此,当在回调中调用 resolve 时,angular 不在 $apply 循环中,并且它不知道函数调用。

要解决这个 $scope.$apply() 应该在 resolve 函数之后立即调用。如果在服务中,并且 $scope 可注入不可用,您可以注入 $rootScope 代替。

于 2013-06-01T18:17:02.760 回答