在foreach循环中调用javascript函数,是否等待回复?
我对如何解决这个问题有点困惑。 我有一个函数updateDate(id),它用传递的id更新数据库中的特定行。该函数对PHP脚本进行AJAX调用,运行起来需要一些时间 然后,我使用另一个名为updateDates()的函数,它对另一个PHP脚本进行AJAX调用,以获取所有需要更新的ID,然后循环这些ID,并使用循环中的当前ID调用updateDate(ID) 问题在于,循环似乎没有等待updateDate(id)的响应,然后再继续循环,因此它会同时创建239857235ajax调用,然后出错 如何使循环在继续之前等待来自updateDate(id)的响应 当AJAX调用的readyState为4(表示响应完成时)并且我在循环中尝试执行以下操作时,updateDate(id)返回true:在foreach循环中调用javascript函数,是否等待回复?,javascript,ajax,function,loops,Javascript,Ajax,Function,Loops,我对如何解决这个问题有点困惑。 我有一个函数updateDate(id),它用传递的id更新数据库中的特定行。该函数对PHP脚本进行AJAX调用,运行起来需要一些时间 然后,我使用另一个名为updateDates()的函数,它对另一个PHP脚本进行AJAX调用,以获取所有需要更新的ID,然后循环这些ID,并使用循环中的当前ID调用updateDate(ID) 问题在于,循环似乎没有等待updateDate(id)的响应,然后再继续循环,因此它会同时创建239857235ajax调用,然后出错 如
if( updateDate( id ) ) { Do something. }
没有帮助。
有什么想法吗
编辑:这里是一些需要的代码
updateDates():
函数updateDates()
{
ids=新的XMLHttpRequest();
id.open(“GET”,“”,true);
ids.onreadystatechange=函数(){
如果(ids.readyState==4)
{
var response=$.evalJSON(ids.responseText);
if(response.type==1)
{
$.each(response.message、函数(索引、值){
如果(值!='')
{
if(更新日期(值))
警报('选中:'+值);
}
});
}
}
}
id.send(空);
}
更新日期(id):
函数更新日期(id)
{
req=新的XMLHttpRequest();
请求打开(“获取”、“id+true”);
req.onreadystatechange=函数(){
如果(req.readyState==4)
{
var值=$.evalJSON(req.responseText);
//正在更新站点上的DIV。。
返回true;
}
}
请求发送(空);
}
AJAX代表异步的Javascript和XML。这意味着它在继续之前不会等待响应。如果您希望它在继续之前等待,请改为使用它。AJAX代表AsynchronousJavascript和XML。这意味着它在继续之前不会等待响应。如果您希望它在继续之前等待,那么改为使用它。我认为技巧是定义一个回调,在AJAX函数完成时调用该回调,然后从那里递归调用updateDates函数
在伪代码中:
function updateDates(items) {
current_id = items[0];
updateDate(current_id, oncomplete: function() {
next_items = everything_but_current_item(items, current_id)
updateDates(next_items)
});
}
经过一定量的递归后,可能会出现堆栈溢出,但我认为这是最简单的实现方法。我认为诀窍是定义一个在AJAX函数完成时调用的回调函数,然后从那里递归调用updateDates函数 在伪代码中:
function updateDates(items) {
current_id = items[0];
updateDate(current_id, oncomplete: function() {
next_items = everything_but_current_item(items, current_id)
updateDates(next_items)
});
}
经过一定量的递归后,您可能会出现堆栈溢出,但我认为这是实现的最简单方法。您没有显示太多代码或使用什么进行ajax调用,但您可以执行类似以下伪代码的操作,即在上一次成功后启动下一次ajax调用:
var idArray = []; // suppose this is an array of ids that you want to update with individual ajax calls.
function updateNextId(list, index) {
if (index < (list.length - 1)) {
++index;
var id = idArray[index]
ajax(parmss, function() {
// success handler
updateNextId(list, index);
});
}
}
var-idArray=[];//假设这是一个ID数组,您希望通过单独的ajax调用来更新它。
函数updateNextId(列表、索引){
如果(索引<(列表长度-1)){
++指数;
变量id=idArray[索引]
ajax(parmss,function(){
//成功处理者
updateNextId(列表、索引);
});
}
}
更好的解决方案是在一个ajax调用中发送所有ID,让服务器只处理多个ID。您没有显示太多代码或使用什么进行ajax调用,但您可以执行类似以下伪代码的操作,即在前一个ajax调用成功后启动下一个ajax调用:
var idArray = []; // suppose this is an array of ids that you want to update with individual ajax calls.
function updateNextId(list, index) {
if (index < (list.length - 1)) {
++index;
var id = idArray[index]
ajax(parmss, function() {
// success handler
updateNextId(list, index);
});
}
}
var-idArray=[];//假设这是一个ID数组,您希望通过单独的ajax调用来更新它。
函数updateNextId(列表、索引){
如果(索引<(列表长度-1)){
++指数;
变量id=idArray[索引]
ajax(parmss,function(){
//成功处理者
updateNextId(列表、索引);
});
}
}
更好的解决方案是在一个ajax调用中发送所有ID,让服务器只处理多个ID。尝试使用jQuery循环方法
。each()
、jQuery$。ajax()
和回调函数:
$('your element selection').each(function(){
var thisElement=this;
$.ajax(url,{
success:function(data, textStatus, jqXHR){
//do something to 'thisElement' element with 'data'
}
});
});
我同意上一张海报中的观点,即使用多个ID的单个AJAX调用更好。尝试使用jQuery循环方法
。each()
、jQuery$。AJAX()
和回调函数:
$('your element selection').each(function(){
var thisElement=this;
$.ajax(url,{
success:function(data, textStatus, jqXHR){
//do something to 'thisElement' element with 'data'
}
});
});
我同意上一篇文章中的观点,即使用多个ID进行单个AJAX调用更好。有两种很好的方法可以做到这一点,而不会影响同步(并锁定)UI A.创建批量更新PHP脚本 这个很简单。扩展PHP脚本,使其可以获取ID和日期列表,而不是一次只获取一个。这是性能最好的解决方案 B.转换为队列 您应该将updateDates()转换为一个出列函数。这意味着: 每次调用updateDates()时,它都会弹出