一尘不染

如何在不冻结网页的情况下同步调用Ajax

ajax

我有一些JavaScript,可以触发对PHP脚本的约100次调用。php脚本会占用大量内存,并需要几秒钟才能完成,然后返回通过或失败的json响应。

我不希望ajax调用是异步的,因为服务器将停止运行其自身的100个实例,因此我尝试使用同步,唯一的问题是它冻结了网页,同时一次调用了一个脚本。

如何一次关闭一个Ajax调用并且不冻结我所在的页面?

var a = [];
    a[0] = 'test';
    a[1] = 'hello';
    a[2] = 'another';

$(document).ready(function(){ 
  $.each(a, function(k,v) {
$.ajax({
  url:'/this-script-takes-a-few-seconds-to-complete.php',
  async:false,
  data: {foo: v},
  success: function(data){      
    console.log(data);  
  }
});
  });
});

阅读 198

收藏
2020-07-26

共1个答案

一尘不染

您可以放入执行下一个调用的函数,然后从success处理程序中调用该函数,如下所示:

$(function(){ 
  var i = 0;
  function nextCall() {
    if(i == a.length) return; //last call was last item in the array
    $.ajax({
      url:'/this-script-takes-a-few-seconds-to-complete.php',
      data: { foo: a[i++] },
      success: function(data){      
        console.log(data);  
        nextCall();
      }
    });
  }
  nextCall();
});

虽然…更好的方法是不进行100次呼叫,除非这是某种测试套件,否则我将重新研究整个方法。

2020-07-26