我正在尝试使用ajax调用构建一个jquery每个循环,但由于某种原因它不会停止执行,因此循环我的所有代码。
我在这里做错了什么?
每个循环:
$.each(JSEFileNames, function(key, value){
$.ajax({ url: "/"+key,
success: function(r){
$(JSEPlaceholder).html(r);
JSEFileNames[key] = $(JSEPlaceholder).text().toString().replace(/(\r\n|\n|\r)/gm,"") + $(JSEPlaceholder).children().text().toString().replace(/(\r\n|\n|\r)/gm,"");
$(JSEPlaceholder).empty();
return;
}
});
});
JSEFileNames包含类似于
的内容JSEFileNames= {
"index.php": "",
"something.txt": ""
}
和JSEPlaceholder只是一个包含“#searchBox”的字符串。
答案 0 :(得分:0)
请注意return
是没有意义的,因为它已经是函数的最后一行。它只会退出此函数,但$.each
将继续执行,因为它包含在另一个函数中。
如果您分解代码会发生这种情况:
$.each(JSEFileNames, ajaxFunction);
function ajaxFunction(key, value){
$.ajax({ url: "/"+key, success: successFunction });
}
function successFunction(r) {
$(JSEPlaceholder).html(r);
JSEFileNames[key] = $(JSEPlaceholder).text().toString().replace(/(\r\n|\n|\r)/gm,"") + $(JSEPlaceholder).children().text().toString().replace(/(\r\n|\n|\r)/gm,"");
$(JSEPlaceholder).empty();
return;
}
在这里,您可以看到return
没有按照您的意愿行事。您需要在return false
调用中执行ajaxFunction
才能停止此操作。这是一个如何做到这一点的例子:
$.each(JSEFileNames, function(key, value){
cont = true;
$.ajax({ url: "/"+key, async: false,
success: function(r){
$(JSEPlaceholder).html(r);
JSEFileNames[key] = $(JSEPlaceholder).text().toString().replace(/(\r\n|\n|\r)/gm,"") + $(JSEPlaceholder).children().text().toString().replace(/(\r\n|\n|\r)/gm,"");
$(JSEPlaceholder).empty();
cont = false;
}
});
return cont;
});
这里发生的事情是return value
value
评估false
将停止jQuery循环;如果value
为true
,则循环将继续运行。有关官方文档,请参阅here。
请注意我添加了async: false
;实际上,$.ajax
是一个异步函数,它将在cont
被修改之前返回。只有在请求成功或失败后,才会在稍后处理基础调用。解决这个问题的一种方法是使请求同步,但它会阻止其余代码在此期间执行。这可能是您在这里寻找的,因为您可以在多个页面上明显地执行搜索,并且您不希望一次搜索所有页面,而是检查一个页面在另一个之后。