如何在没有网页冻结的情况下同步调用ajax

Pau*_*aul 3 ajax jquery webpage freeze

我有一些javascript,可以触发大约100个调用php脚本.php脚本占用大量内存并需要几秒钟才能完成,然后返回json响应pass或fail.

我不希望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);  
  }
});
  });
});
Run Code Online (Sandbox Code Playgroud)

Nic*_*ver 15

你可以输入一个执行下一个调用的函数,并从你的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();
});
Run Code Online (Sandbox Code Playgroud)

虽然......更好的方法是不要拨打100个电话,除非这是一个类型的测试套件,我会重新访问整个方法.

  • 注意:如果您从ajax回调的执行上下文中触发Ajax请求,IE6将会阻塞.将setCall()调用包装在setTimeout()中以避免该问题(如果您的目标是IE6兼容性). (2认同)