运行 使用 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 并没有真正提供优于简单回调的优势。
我有一个异步函数,例如:
$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 并没有真正提供优于简单回调的优势。