异步jquery和循环的问题

时间:2010-06-13 05:58:14

标签: jquery arrays loops module

我很困惑。我试图通过循环数组并调用我编写的名为addModule()的方法将门户附加到页面。该方法被调用正确的次数(通过警告语句检查),按正确的顺序,但实际上只有一个或两个门户填充。我对循环和异步有一些感觉,但用代码更容易解​​释:

moduleList = [['weather','test'],['test']];

for(i in moduleList) { $('#content').append(''); for(j in moduleList[i]) { addModule(i,moduleList[i][j]); //column,name } }

function addModule(column,name) { alert('adding module ' + name); $.get('/modules/' + name.replace(' ','-') + '.php',function(data){ $('#'+column).append(data); }); }

对于主数组中的每个数组,我追加一个新列,因为这是每个子数组的 - 一列门户。然后我循环遍历该子数组并在该列上调用addModule以及该模块的名称(该模块正常工作)。在我的addModule方法中发生了一些错误,它只添加了第一个和最后一个模块,有时候是中间模块,有时甚至根本没有...我很困惑!

2 个答案:

答案 0 :(得分:1)

你确定这不是PHP的问题吗?

它适用于我(使用备用http请求)。

在此进行测试: http://jsfiddle.net/kkxBH/1/ (已更新)

当然,附加到同一列中的项目可能不会以与发送时相同的顺序附加。而是按照收到回复的顺序。不一定相同。

编辑:已更新,以确保订单正确。

moduleList = [['weather','test'],['test'],['some','other']];

request = ['http://www.microsoft.com',
           'http://www.apple.com',
           'http://www.google.com'];


for(i in moduleList) {
    for(j in moduleList[i]) {
        addModule(i,moduleList[i][j], j); //column,name, j index
    }
}

    // Receive "j" from inner for() loop
function addModule(column,name, j) {

         // Reference the column
    var $column = $('#'+column);

         // Append a new <span> tag to the column that has
         //   the value of "j" as the class name
    $('<span/>',{ className:j }).appendTo($column);

    $.get(request[column],function() {
           // Append the result to the proper span in the proper column.
           // (Of course, you'll be appending your data returned.)
        $column.find('span.' + j).append(name);
    });
}​

答案 1 :(得分:0)

@patrick,感谢您的建议,但这并不能解决问题。它与异步调用有关,因为如果我使用原始$ .ajax而不是$ .get将async设置为fase,我会以正确的顺序获取门户网站:)。但是使用同步非常糟糕且非常慢,而且模块本身依赖于内部的异步代码......