使用promises多次运行相同的异步函数

时间:2015-10-09 08:07:30

标签: javascript angularjs ionic angular-promise

我有一个异步函数,如:

$scope.get_device_version = function(){
       return $q(function(resolve, reject){
            $http.get('/api/get_version')
                .then(function(response) {
                    resolve(response.data.version);
                },function(response) {
                    reject("Lost connection..");
            });
       });
};

问题1:现在我想连续10次连续运行该功能,我该怎么办?

问题2:现在我想运行该功能,直到我从http请求中得到所需的答案,我该怎么办?

3 个答案:

答案 0 :(得分:3)

问题1

.then(callback)返回一个新的promise,它解析为callback的返回值,或者如果返回值是另一个promise,则返回到该promise的已结算值。这可以用于链接异步调用。例如,给定

function myFunction() { return promise; }

以下代码段将按顺序调用myFunction 10次

var result = $q.resolve();
for (var i = 0; i < 10; ++i) {
    result = result.then(myFunction);
}
result.then(function () { /* myFunction has been called 10 times */ })

问题2

这里需要递归,因为您不知道需要迭代的确切次数。例如,如上所述myFunction

function wrapper() {
    var deferred = $q.defer();

    iter();
    function iter(res) {
        // skip first iter() call, wait for acceptable res
        if (result !== void 0 && /* res is what I want */) {
            return deferred.resolve(res);
        }

        // recurse
        return myFunction().then(iter);
    }

    return deferred.promise;
}

wrapper().then(function (res) { /* res is an acceptable response */ })

请注意,对于此用例,promises并不比简单的回调更有优势。

答案 1 :(得分:0)

问题1:

var request = null;

for( var i = 0; i < 10; i++ ) {

  if( request )
      request.then( $scope.get_device_version );
  else
      request = $scope.get_device_version();


}

问题2:

$scope.get_device_version = function(){
       return $q(function(resolve, reject){
            $http.get('/api/get_version')
                .then(function(response) {

                    if( /*Not a desired answer? run again:*/ )
                        $scope.get_device_version()
                    else
                        resolve(response.data.version);


                },function(response) {
                    reject("Lost connection..");
            });
       });
};

答案 2 :(得分:0)

这是伪代码,我还没有测试过。

var checkDeviceVersion=function (times) {
    $scope.get_device_version().then(function(data) {
        if(times==0) return;
        checkDeviceVersion(times-1);
    });
}

var keepChecking=function () {
    $scope.get_device_version().then(function(data) {
        if(data.condition) return;
        keepChecking();
    });
}

然后调用checkDeviceVersion(10)keepChecking()