如何编写一个返回angularjs中的promise的异步方法?

时间:2014-08-05 12:51:34

标签: javascript angularjs asynchronous

我正在开发一个AngularJS应用程序。

我尝试编写一个服务方法,可以定期从HTTP请求中自动重新加载某些内容,并通知调用该方法的控制器。

所以我搜索使用AngularJS的promse API并使用$ timeout服务,但是当方法不是异步运行时我无法返回promise ...

所以在这里,承诺永远不会归还,我理解为什么,但我不知道做我想做的正确模式是什么。

angular.module('myModule')

.factory('myService', [
    '$timeout',
    '$q',
    '$doMyHttpRequest',
function($timeout, $q, $doMyHttpRequest){

    var d = $q.defer();

    return function(){        
        autoRefresh = function(){

            $timeout(function(){
                $doMyHttpRequest(function(){
                    d.notify({ // notify the update success
                        updated: true
                    });
                },function(){
                    d.notify({ // notify the update error
                        updated: false
                    });             
                });
                this.autoRefresh(); // refresh again in 60 seconds
            },60000);

        };
        this.autoRefresh();  

        return d.promise;
    }

}])

.controller('myCtrl', ['myService', function(myService){

    myService().autoRefresh().then(function(){ // never reached because promise is never returned
        // do my stuff when succeed
    },function(){ // never reached because promise is never returned
        // do my stuff when error
    });

}])

;

1 个答案:

答案 0 :(得分:2)

请参见此处:http://jsbin.com/wiveli/1/edit

app.controller('firstCtrl', function($timeout,  doMyHttpRequest){

        function onSucess() {

              console.log("sucess");
               autoRefresh();

            };
         function onError() {

              console.log("error");
              autoRefresh();

            }


    function autoRefresh(){




        $timeout(function(){
         doMyHttpRequest.getData().then(onSucess, onError);

        },1000);  

    }
   autoRefresh();

});