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

Run same async function multiple times with promises

我有一个异步函数,例如:

$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 请求中得到所需的答案,我该怎么做?

问题 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..");
            });
       });
};

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

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()

问题 1

.then(callback) returns 一个新的 promise 解析为 callback 的 return 值,或者如果 return 值是另一个 promise,则为 settled该承诺的价值。这可用于链接异步调用。例如,给定

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 */ })

问题二

此处需要递归,因为您不知道需要迭代的确切次数。例如,给定 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 并没有真正提供优于简单回调的优势。