如何在.each循环内的Jquery回调完成后执行函数

时间:2015-02-03 23:28:50

标签: javascript jquery callback devexpress each

我有一个调用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;    
}

2 个答案:

答案 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;
&#13;
&#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;
}