我有一个异步函数,如:
$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请求中得到所需的答案,我该怎么办?
答案 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()