我有一个调用JQuery.each()的函数。然后它调用执行回调的第三方函数(Devexpress GetRowValues())。 在.each完成之后,我必须调用DoSuccess()并传入数组rv。 问题是RVGridCB()在DoSuccess()之后执行。在执行DoSuccess()之前,如何确保.each循环中的所有回调都已完成?
function ReturnValueAndClose(ctrl) {
var rv = new Array();
$('[id*="chkCopy"]').each(function () {
try {
var v = $(this).val();
if (v == 'C') {
var id = eval($(this)[0].id).id;
var i = id.indexOf('chkCopy_') + 8;
var rowIndex = parseInt(id.substr(i, 4));
wgdFormFile.GetRowValues(rowIndex, "Name;Description;Details", RVGridCB);
}
} catch (e) {
}
});
function RVGridCB(values) {
rv.push(values);
}
DoSuccess(new Array('1', rv));
return false;
}
答案 0 :(得分:2)
我认为您可以使用deferred个对象。
为每个回调RVGridCB
创建一个包含延迟对象的数组,并在回调调用dfd.resolve()
内创建。
在完成回调$.when.apply($, deferred_arr).done(function () ...);
中,您可以拨打doSuccess(...)
。
这是一个带有超时的延迟示例,用于模拟异步事件。您也可以在jsFiddle找到它。
编辑04.02.2015:
我已经为每个deffered对象添加了一个完成回调,以便更好地显示每个超时的结束。
var asyncEvent = function (n) {
var dfd = $.Deferred();
var duration = n * 1000;
setTimeout(function () {
dfd.resolve(n);
}, duration);
dfd.done(function(n) {
var now = new Date();
//console.log('end time', n, now);
$('body').append('end time of task ' + n + ': '+ now.toString() + '<br/>');
});
return dfd;
};
var thingsToDo = [1, 2, 3, 4];
var def = [];
var events = function () {
$.each(thingsToDo, function (index, value) {
var now = new Date();
$('body').append('start time: ' + now.toString() + '<br/>');
//console.log('called', value);
def.push(asyncEvent(value));
});
return def;
};
$.when.apply($, events())
.done(function (status) {
//console.log(def);
var now = new Date();
console.log('end time', now);
$('body').append('end time: ' + now.toString() + '<br/>');
$('body').append('all events done');
});
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
&#13;
答案 1 :(得分:-1)
查看jquery Deferred对象。
如果您的GetRowValues方法返回Deferred对象,您可以尝试将它们存储在数组中
var valuesDone = [];
$('[id*="chkCopy"]').each(function(){
valuesDone.push(
wgdFormFile.GetRowValues(rowIndex, "Name;Description;Details").done(RVGridCB)
);
})
之后,使用jquery'$ .when()'方法,在所有'值完成'时设置回调。
$.when.apply($, valuesDone).done(function(){ DoSuccess(new Array('1', rv)); })
如果你的GetRowValues方法没有返回Deferred ,你可以使外观功能:
function GetRowValues(rowIndex){
var d = new $.Deferred();
wgdFormFile.GetRowValues(rowIndex, "Name;Description;Details", function(){ d.resolve() });
return d;
}