Javascript 如何在内部Jquery回调后执行函数。每个循环都已完成

Javascript 如何在内部Jquery回调后执行函数。每个循环都已完成,javascript,jquery,callback,devexpress,each,Javascript,Jquery,Callback,Devexpress,Each,我有一个调用JQuery.each()的函数。然后调用执行回调的第三方函数(Devexpress GetRowValues())。 完成.each之后,我必须调用DoSuccess()并传入数组rv。 问题是RVGridCB()在DoSuccess()之后执行。如何确保在执行DoSuccess()之前完成.each循环中的所有回调 我想你可以处理物体 为每个回调RVGridCB和回调调用内部dfd.resolve()创建一个带有延迟对象的数组 在done回调中$.when.apply($,def

我有一个调用JQuery.each()的函数。然后调用执行回调的第三方函数(Devexpress GetRowValues())。 完成.each之后,我必须调用DoSuccess()并传入数组rv。 问题是RVGridCB()在DoSuccess()之后执行。如何确保在执行DoSuccess()之前完成.each循环中的所有回调


我想你可以处理物体

为每个回调
RVGridCB
和回调调用内部
dfd.resolve()
创建一个带有延迟对象的数组

在done回调中
$.when.apply($,deferred_arr).done(函数()…)
您可以调用
doSuccess(…)

下面是一个带有超时的延迟示例,用于模拟异步事件。你也可以在这里找到它


编辑2015年2月4日:

我为每个不同的对象添加了一个done回调,以更好地显示每个超时的结束

var asyncEvent=函数(n){
var dfd=$.Deferred();
var持续时间=n*1000;
setTimeout(函数(){
dfd.resolve(n);
},持续时间);
dfd.done(功能(n){
var now=新日期();
//log('end time',n,now);
$('body').append('task'+n+':'+now.toString()+'
'); }); 返回dfd; }; var thingsToDo=[1,2,3,4]; var def=[]; var事件=函数(){ $.each(thingsToDo,函数(索引,值){ var now=新日期(); $('body').append('start time:'+now.toString()+'
'); //log('called',值); 定义推送(异步事件(值)); }); 返回def; }; $.when.apply($,events()) .完成(功能(状态){ //控制台日志(def); var now=新日期(); log(“结束时间”,现在); $('body').append('end time:'+now.toString()+'
'); $('body').append('all events done'); });
查看jquery延迟对象

如果GetRowValues方法返回延迟对象,则可以尝试将它们存储在数组中

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方法未返回延迟的,则可以使facade函数:

function GetRowValues(rowIndex){
    var d = new $.Deferred();
    wgdFormFile.GetRowValues(rowIndex, "Name;Description;Details", function(){ d.resolve() });
    return d;
}

根据定义,每个jQuery都是同步的,但在其中调用的任何异步都不会阻止每个jQuery的完成。在上面的代码块中,wgdFormFile.getRowValues似乎是异步的。我需要对该函数多了解一点才能提出一个好的建议GetRowValues的文档可以在:1秒处找到。我在打字out@deweyredman我试图使用类似于您发布的答案的内容。你让我思考我的逻辑和延迟对象,然后出现了当前的答案。是的,这是一个更好的方法:)实际上没有意识到这些…这是一个更好的解决方案。Downvoter,你为什么不评论我的解决方案有什么问题?
function GetRowValues(rowIndex){
    var d = new $.Deferred();
    wgdFormFile.GetRowValues(rowIndex, "Name;Description;Details", function(){ d.resolve() });
    return d;
}