我正在开发一个基于HTML5的SalesForce移动网络应用程序。我们大量使用JavaScript远程处理函数,我想知道如何等待这些远程函数调用中的N(多个)完成,然后触发另一个事件或函数调用。我们试图完成的用例如下:
发布于 2012-08-30 23:15:14
以下是我通常如何处理这个案件:
function doManyAsync(doneCallback) {
// Async worker counters
var workers = 0;
function tickWorkers() {
workers--;
if ( workers === 0 ) {
if ( doneCallback )
doneCallback();
}
}
// Queue off first one
doAsyncFunc1(1,2,3, tickWorkers);
workers++;
// Queue off second
doAsyncFunc2(function() {
tickWorkers();
});
workers++;
}
异步工作者计数器在异步函数的作用域之外使用,以跟踪它们。对于启动的每个异步函数,增加计数器。当它们完成时,回调将减少,直到它们全部完成,并调用已完成的回调。这依赖于每个函数的增量。如果异步函数有失败的风险,那么您可以设置一个超时,以不时检查工作人员计数,如果超过阈值而不是0,则会按需要失败或生成错误。
下面是代码的外观:
function doManyAsync(doneCallback) {
// Async worker counters
var workers = 0;
function tickWorkers() {
workers--;
if ( workers === 0 ) {
if ( doneCallback )
doneCallback();
}
}
// Remote Request 1
MyController.f1(
function(result, event){
tickWorkers();
if(event.type == 'exception') {
alert('Error: ' + event.message);
} else {
// Do stuff here such as fill in a form with the results from f1
}
},
{escape:true});
workers++;
// Remote Request 2
MyController.f2(
function(result, event){
tickWorkers();
if(event.type == 'exception') {
alert('Error: ' + event.message);
} else {
// Do stuff here such as fill in a form with the results from f2
}
},
{escape:true});
workers++;
// ...
// Remote Request N
MyController.fN(
function(result, event){
tickWorkers();
if(event.type == 'exception') {
alert('Error: ' + event.message);
} else {
// Do stuff here such as fill in a form with the results from fN
}
},
{escape:true});
workers++;
}
// You would then
$.mobile.showPageLoadingMsg();
doManyAsync(function() {
$.mobile.hidePageLoadingMsg();
})
发布于 2012-08-30 23:20:12
当jQuery和完成函数时,尝试使用。
$.when(asyncFunc1, asyncFunc2).done(yourCallbackHere)
这样,当第一个子句中的所有操作都完成时,就会调用回调函数。
您还可以将done替换为然后,无论提供的延迟对象是解析还是拒绝,都将调用您的回调。
这是一个你可以尝试的简单例子:
// Remote Request 1
MyController.f1(
function(result, event){
var dfr = $.Deferred(); // New deferred object.
if(event.type == 'exception') {
dfr.reject(); // Error, object should be rejected.
} else {
// Do stuff here such as fill in a form with the results from f1
dfr.resolve(); // Success, object is resolved.
}
return dfr; // Return the deferred object.
});
可以理解,f1
函数可能不会返回与内部回调dfr
相同的结果。如果是这样的话,现在看来,这是可信的:
$when(MyController.f1).done(successCallback); // Callback only if resolved.
$when(MyController.f2).then(alwaysCallback); // Callback if resolved or rejected.
https://stackoverflow.com/questions/12206569
复制相似问题