0

我在下面有一个每个循环,它通过 div#canvas(与 HTML5 的画布无关)寻找必须加载的元素。基本上,如果一个元素具有目标属性(第 1 行)并且指向的目标(target$)不在 div#canvas(第 6 行)中,则会启动 Ajax $.post 请求(第 7 行)以将丢失的目标带入从服务器并将其添加到 div#canvas。

$("#canvas .active[target]").each(function() { 
    this$ = $(this);
    targetName = this$.attr('target'); 
    target$ = $('div[name=' + targetName + ']');

    if (target$.length == 0) {
        $.post('loadData.php', { fileName : targetName + '.xml' },function(xml) {  
            canvasData$ = $(xml).find("canvasData");  
            $('#canvas').prepend(canvasData$);      
        });
    }
});   

当所有这些缺失的目标都被加载后,我想发出一个 Ajax 请求将所有目标发送div#canvas到服务器。该调用如下所示:

Status$.load('writePage.php', { 
    pageName: pageName, 
    seg1: seg1, 
    canvas: canvasOuterHTML,
    seg2: seg2
});

有人可以提出最好的方法来推迟最后一次调用,writePage直到所有丢失的目标读取完成?

谢谢。

4

2 回答 2

1

使用 $.when

var array = [];
$("#canvas .active[target]").each(function() { 
    this$ = $(this);
    targetName = this$.attr('target'); 
    target$ = $('div[name=' + targetName + ']');

    if (target$.length == 0) {
        var ajax = $.post('loadData.php', { fileName : targetName + '.xml' },function(xml) {  
            canvasData$ = $(xml).find("canvasData");  
            $('#canvas').prepend(canvasData$);      
        });
        array.push(ajax)
    }
});
$.when.apply($, array).done(function(){
    //do something
})
于 2013-08-17T15:43:13.177 回答
1

您可以通过将返回的延迟推入数组并使用来做到这一点$.when

var xhrs = [];

$("#canvas .active[target]").each(function() { 
    var targetName = this.getAttribute('target'),
        target     = $('div[name="' + targetName + '"]');

    if (!target.length) {
        var xhr = $.post('loadData.php', { fileName : targetName + '.xml' },function(xml) {  
            var canvasData = $(xml).find("canvasData");  
            $('#canvas').prepend(canvasData);
        });
        xhrs.push(xhr)
    }
});   

$.when.apply($, xhrs).then(function() {
    // do something when all request have completed
});
于 2013-08-17T15:43:20.177 回答