异步jquery和循环的问题
我很困惑。我试图通过循环数组并调用我编写的名为addModule()的方法,将门户附加到页面。该方法以正确的顺序被调用了正确的次数(通过警报语句检查),但实际上只填充了一到两个门户。我感觉它与循环和异步有关,但代码更容易解释:异步jquery和循环的问题,jquery,arrays,loops,module,Jquery,Arrays,Loops,Module,我很困惑。我试图通过循环数组并调用我编写的名为addModule()的方法,将门户附加到页面。该方法以正确的顺序被调用了正确的次数(通过警报语句检查),但实际上只填充了一到两个门户。我感觉它与循环和异步有关,但代码更容易解释: moduleList=[['weather'、'test']、['test'] for(模块列表中的i){ $(“#内容”)。追加(“”); 对于(模块列表[i]中的j){ addModule(i,moduleList[i][j]);//列,名称 } } 函数addMod
moduleList=[['weather'、'test']、['test']
for(模块列表中的i){
$(“#内容”)。追加(“”);
对于(模块列表[i]中的j){
addModule(i,moduleList[i][j]);//列,名称
}
}
函数addModule(列、名称){
警报(“添加模块”+名称);
$.get('/modules/'+name.replace('''-')+'.php',函数(数据){
$('#'+列).append(数据);
});
}
对于主数组中的每个数组,我都会添加一个新列,因为每个子数组都是一列门户。然后我循环遍历该子数组,并在该列上调用addModule和该模块的名称(该模块工作正常)。在我的addModule方法中出现了一些错误,它只添加第一个和最后一个模块,或者有时添加中间的模块,或者有时根本不添加任何模块。。。我真糊涂 @patrick,谢谢你的建议,但这并不能解决问题。这与异步调用有关,因为如果我使用原语$.ajax而不是$.get将async设置为fase,那么我将以正确的顺序获取门户:)。但是使用sync非常糟糕而且非常慢,加上模块本身依赖于内部的异步代码…@patrick,谢谢你的建议,但这并不能解决问题。这与异步调用有关,因为如果我使用原语$.ajax而不是$.get将async设置为fase,那么我将以正确的顺序获取门户:)。但是使用sync非常糟糕而且非常慢,加上模块本身依赖于内部的异步代码…您确定这不是PHP的问题吗 它对我来说很好(使用备用http请求) 在此处测试:(更新) 当然,附加到同一列中的项目可能不会按照发送时的顺序进行附加。而是按照收到响应的顺序。不一定相同 编辑:更新以确保正确的顺序
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);
});
}
moduleList=[['weather','test'],['test'],['some','other'];
请求=['http://www.microsoft.com',
'http://www.apple.com',
'http://www.google.com'];
for(模块列表中的i){
对于(模块列表[i]中的j){
addModule(i,moduleList[i][j],j);//列,名称,j索引
}
}
//从内部for()循环接收“j”
函数addModule(列、名称、j){
//引用该列
变量$column=$(“#”+列);
//将新标记附加到具有
//“j”的值作为类名
$('',{className:j}).appendTo($column);
$.get(请求[列],函数(){
//将结果附加到适当列中的适当范围。
//(当然,您将附加返回的数据。)
$column.find('span.'+j).append(名称);
});
}
您确定这不是PHP的问题吗
它对我来说很好(使用备用http请求)
在此处测试:(更新)
当然,附加到同一列中的项目可能不会按照发送时的顺序进行附加。而是按照收到响应的顺序。不一定相同
编辑:更新以确保正确的顺序
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);
});
}
moduleList=[['weather','test'],['test'],['some','other'];
请求=['http://www.microsoft.com',
'http://www.apple.com',
'http://www.google.com'];
for(模块列表中的i){
对于(模块列表[i]中的j){
addModule(i,moduleList[i][j],j);//列,名称,j索引
}
}
//从内部for()循环接收“j”
函数addModule(列、名称、j){
//引用该列
变量$column=$(“#”+列);
//将新标记附加到具有
//“j”的值作为类名
$('',{className:j}).appendTo($column);
$.get(请求[列],函数(){
//将结果附加到适当列中的适当范围。
//(当然,您将附加返回的数据。)
$column.find('span.'+j).append(名称);
});
}
不知道这是否有助于解决问题,但ID不应以数字开头。只有一封信。我的理解是,你的一些请求没有得到回应。问题是您没有将它们整理好吗?如果问题仅仅是正确的顺序,那么我建议您的addModule()
函数在适当的列中为它发出的每个$.get()
请求创建一个枚举的
容器。然后,当收到响应时,将结果附加到适当的span
编号。我将看看是否可以更新我的示例。下面的示例应确保正确的顺序:不知道这是否有助于解决问题,但ID不应以数字开头。只有一封信。我的理解是,你的一些请求没有得到回应。问题是您没有将它们整理好吗?如果问题仅仅是正确的顺序,那么我建议您的addModule()
函数在适当的列中为它发出的每个$.get()
请求创建一个枚举的
容器。然后,当收到响应时,将结果附加到适当的span
编号。我会看看是否可以更新我的示例。以下示例应确保正确的顺序:(对不起,这是回应您的评论的唯一方式)@Seth-请使用您的对话答案下的评论功能。谢谢o) @Seth-这是因为您使用的用户名不同。如果你登录