Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/446.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在foreach循环中调用javascript函数,是否等待回复?_Javascript_Ajax_Function_Loops - Fatal编程技术网

在foreach循环中调用javascript函数,是否等待回复?

在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调用,然后出错 如

我对如何解决这个问题有点困惑。 我有一个函数updateDate(id),它用传递的id更新数据库中的特定行。该函数对PHP脚本进行AJAX调用,运行起来需要一些时间

然后,我使用另一个名为updateDates()的函数,它对另一个PHP脚本进行AJAX调用,以获取所有需要更新的ID,然后循环这些ID,并使用循环中的当前ID调用updateDate(ID)

问题在于,循环似乎没有等待updateDate(id)的响应,然后再继续循环,因此它会同时创建239857235ajax调用,然后出错

如何使循环在继续之前等待来自updateDate(id)的响应

当AJAX调用的readyState为4(表示响应完成时)并且我在循环中尝试执行以下操作时,updateDate(id)返回true:

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()时,它都会弹出