从服务返回时AngularJS承诺不解雇[复制](AngularJS promises not fi

2019-07-18 17:12发布

可能重复:
angularjs -承诺在控制器未曾解决

我在一家AngularJS服务包一个缓慢的WebSockets服务器,然后调入从我的控制器,服务。 如果我连锁回调到回调到回调,一切都运行得很好,任何用户界面异步更新。

当我尝试使用$q.defer()清理回调的那件事情,似乎我的延期不会被调用。 我熟悉的从Python的扭曲推迟的概念,所以我认为从概念上就可以工作了 - 但事实并非如此。

这是我能想出,慢的WebSockets服务器模拟了一个setTimeout函数最短的例子。

<!doctype html>

<html ng-app="beta">
    <head>
        <title>Beta</title>
        <script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.0.4/angular.min.js"></script>
        <script>
            var beta = angular.module('beta', []);

            var BetaCtrl = function ($scope, betaServ) {
                $scope.button = function () {
                    serv_result = betaServ.slow();
                    console.log(serv_result);

                    serv_result.then(function (result) {
                        console.log('callback finished');
                    });
                }
            }

            beta.service('betaServ', function($q) {
                this.slow = function () {
                    d = $q.defer()
                    setTimeout(function () {
                        console.log('before resolve');
                        d.resolve();
                        console.log('after resolve');
                    }, 2000);
                    return d.promise;
                }
            });
        </script>
    </head>
    <body>
        <div ng-controller="BetaCtrl">
            <button ng-click="button()">Run</button>
        </div>    
    </body>
</html>

该会应如下运行:

  1. 点击按钮
  2. $ scope.button()被调用; 它调用service.slow()函数
  3. service.slow()返回一个deferred
  4. 回调注册的延期
  5. 递延火灾,引发注册的回调(这部分不会发生)

有任何想法吗? 谢谢。

Answer 1:

你需要调用以$回调适用,因为这就是所谓的角度之外。 由于这是一个服务,你需要在你的服务$ rootScope:

beta.service('betaServ', function($q, $rootScope) {
    this.slow = function () {
        d = $q.defer()
        setTimeout(function () {
            console.log('before resolve');
            $rootScope.$apply(d.resolve);
            console.log('after resolve');
        }, 2000);
        return d.promise;
    }
});


文章来源: AngularJS promises not firing when returned from a service [duplicate]