2015-10-09 127 views
1

運行相同的異步函數多次我有一個異步功能,如:與承諾

$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

問題1

.then(callback)返回一個新的承諾解決到callback返回值,如果返回值是另一個承諾,到結算這個承諾的價值。這可以用來鏈接異步調用。例如,給定

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

注意,對於這種使用情況,承諾沒有真正提供了簡單的回調優勢。

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.."); 
      }); 
     }); 
}; 
+0

請添加說明。僅有代碼的答案很少有幫助。 –

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