jQuery - 异步Ajax请求?

时间:2014-01-16 12:36:14

标签: javascript php jquery ajax asynchronous

我尝试使用ajax请求和响应异步,但似乎无法正常工作。 我发送每秒ajax请求。 控制台应该每秒打印“不要等待”,每5秒打印一次“WAIT5”(在php中睡眠)。 但是,会发生“DO NOT WAIT”被记录,然后整个站点/脚本等待5秒,并且两条消息都被记录5次。 我怎么能让这个异步,所以“不要等待”真的每一秒都来,而不是等待另一个脚本?

//编辑: 这是一个例子。 之后的想法是执行一个代码(不是setInterval),需要10秒才能获得完成状态。在这个时候,另一个setInterval应该正常工作而不是等待! 睡眠为睡眠(兰德(5,10));

使用Javascript:

function getProductionStatus() {
  jQuery.ajax({
      url: "report.sessioncall.php",
      dataType: "json",
      async: true
  })
  .done(function(data) {
      console.log(data);
  });
}
function getProductionStatusLong() {
  jQuery.ajax({
      url: "report.sessioncall1.php",
      dataType: "json",
      async: true
  })
  .done(function(data) {
      console.log(data);
  });
}
window.setInterval(getProductionStatus, 1000);
window.setInterval(getProductionStatusLong, 1000);

PHP:

<?php
session_start();
sleep(5);
$_SESSION["jobs"] = "WAIT5";
$sessionstatus = json_encode($_SESSION["jobs"]);
echo $sessionstatus ;
?>

<?php
session_start();
$_SESSION["jobs"] = "DONT WAIT";
$sessionstatus = json_encode($_SESSION["jobs"]);
echo $sessionstatus ;
?>

2 个答案:

答案 0 :(得分:3)

规则

默认情况下,Ajax请求是异步的。如果您不使用$.ajaxSetup({async:false})更改此设置,则无需在ajax请求中编写async: true

原因是,在大多数情况下,制作同步ajax请求是不好的做法,因为您可以通过阻止浏览器对用户输入作出反应来恶化您的用户体验。

您的具体解决方案

只需更改

  

window.setInterval(getProductionStatusLong,1000);

  

window.setInterval(getProductionStatusLong,5000);

答案 1 :(得分:0)

我不相信这会起作用。

相反尝试这样的事情 - 它不会在第二次运行,没有什么会,但它可能更接近你想要的

var cnt = 0
function getProductionStatus() {
  $.ajax({
      url: "report.sessioncall.php",
      dataType: "json"
  })
  .done(function(data) {
      console.log(data);
      cnt++
      if (cnt==5) {
        getProductionStatusLong()
        cnt=0;
      }
      else  {
        setTimeout(getProductionStatus, 1000); 
      }  

  });
}
function getProductionStatusLong() {
  $.ajax({
      url: "report.sessioncall1.php",
      dataType: "json"
  })
  .done(function(data) {
      console.log(data);
      getProductionStatus();
  });
}
$(function() {getProductionStatus()});