我很困惑。我试图通过循环数组并调用我编写的名为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方法中发生了一些错误,它只添加了第一个和最后一个模块,有时候是中间模块,有时甚至根本没有...我很困惑!
答案 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,我会以正确的顺序获取门户网站:)。但是使用同步非常糟糕且非常慢,而且模块本身依赖于内部的异步代码......