2013-04-03 120 views
3

我有一个页面试图通过jQuery运行3个单独的ajax调用。不幸的是,每次我加载页面时,只有两个ajax调用会运行。另外,3个呼叫中的哪一个将运行并不一致。为什么我不能运行两个以上的连续jQuery ajax调用?

这里是jQuery代码(在order.php页):

$.ajax({ 
     type: "Post", 
     url: "includes/get_product_info.php", 
     data: "id=7", 
     success: function(data) { 
      console.log('First One Works!'); 
     } 
}); 

$.ajax({ 
     type: "Post", 
     url: "includes/get_product_info.php", 
     data: "id=6", 
     success: function(data) { 
      console.log('Second One Works!'); 
     } 
}); 

$.ajax({ 
     type: "Post", 
     url: "includes/get_product_info.php", 
     data: "id=1", 
     success: function(data) { 
      console.log('Third One Works!'); 
     } 
}); 

下面是PHP脚本(get_product_info.php):

include("connection.php"); 
$conn = dbConnect('query'); 

$sql = 'SELECT * 
     FROM products 
     WHERE product_id = ' . $_POST['id']; 

$result = $conn->query($sql) or die(mysqli_error($conn)); 
$rows = array(); 

while($row = $result->fetch_assoc()) { 
    $rows[] = $row; 
} 

echo json_encode($rows); 

当我加载order.php有时它会显示'First One Works'和'Second One Works',但有时它会显示'Third One works'和'First One works'等。这表明,它每次只运行两次ajax调用,是随机的,它会运行。

如何以正确的顺序运行所有三个ajax调用?

+3

您不能保证顺序,因为它是一个异步过程。通常这些请求应该按照它们发送的顺序进行,但这取决于客户端和服务器。如果服务器在第一个响应之前发送第三个响应,那么客户端将在第一个响应之前获得第三个响应,并且在异步环境中没有什么可以对付它。如果您需要按给定顺序发送请求,请不要使用AJAX或在前一个请求成功后发送下一个请求。 – Zeta

+0

您是否尝试过'async:false' – Khaleel

+0

因为有些浏览器会让您在同一时间内执行最多2个请求。 http://stackoverflow.com/a/15765647/739897 – Narek

回答

2

这里有一个不同的方法......

你能不能将它们合并成一个电话吗?

的jQuery:

$.ajax({ 
     type: "Post", 
     url: "includes/get_product_info.php", 
     data: "id[]=7&id[]=6&id[]=1", 
     success: function(data) { 
      // just an example of what to do here 
      $(data).appendTo('body'); 
     } 
}); 

PHP:

include("connection.php"); 
$conn = dbConnect('query'); 

$sql = 'SELECT * 
     FROM products 
     WHERE product_id IN(' . implode(',', $_POST['id']) .')'; 

$result = $conn->query($sql) or die(mysqli_error($conn)); 
$rows = array(); 

while($row = $result->fetch_assoc()) { 
    $rows[] = $row; 
} 

echo json_encode($rows); 
+1

虽然其他解决方案正是我所要求的,但您的解决方案实际上可以加快速度,这正是我想要的结果。所以谢谢你花时间为我写出所有这些!我希望我能给你一个以上的赞扬!再次感谢! – zeckdude

+0

没问题的冠军,很高兴有帮助! – Dale

3

您可以设置异步:假的Ajax调用,如:

$.ajax({ 
     type: "Post", 
     url: "includes/get_product_info.php", 
     data: "id=7", 
     async: false, 
     success: function(data) { 
      console.log('First One Works!'); 
     } 
}); 

它将顺序执行的一切,虽然异步:假杀阿贾克斯的目的。

编辑

或者你可以使用AJAX队列插件。

从文档:

此插件创建这保证只有一个AJAX请求被同时运行的新方法。在使用jQuery的内置队列启动一个新的请求之前,它会等待先前的请求完成。

https://github.com/gnarf37/jquery-ajaxQueue

0

也许是因为jQuery.ajax()

执行异步HTTP(Ajax的)请求。

你可以尝试添加异步:FASLE(默认值:true) 但请记住,它是贬值为documentation stats

在jQuery 1.8,采用异步的:假以jqXHR($ .Deferred)是 已弃用;您必须使用成功/错误/完成回调选项 而不是jqXHR对象的相应方法,如 jqXHR.done()或不赞成使用的jqXHR.success()。

总是使用()调用下一个Ajax调用是这样的:

$.ajax({ 
     type: "Post", 
     url: "includes/get_product_info.php", 
     data: "id=7", 
     success: function(data) { 
      console.log('First One Works!'); 
     } 
}).always(function() { 
$.ajax({ 
     type: "Post", 
     url: "includes/get_product_info.php", 
     data: "id=6", 
     success: function(data) { 
      console.log('Second One Works!'); 
     } 
}); 
}).always(function() { ... ; 
1

这将会是最好的包在自己的函数每次调用,那么,你应该调用在每个连续的AJAX调用以前的回调,所以...

function one(){ 
    $.ajax({ 
    etc... 
    success : two 
    }); 
} 
function two(){ 
    $.ajax({ 
    etc... 
    success : three 
    }); 
} 
function three(){ 
    etc... 
} 

你不需要环绕功能one,two,three...,但它只是看起来更好,意味着你可以重新使用它们。

0

您应该发送使用callback的有序异步请求。

// default callback function 
var noop = function(){} 

$.ajax({ 
    // other parameters 
    success: function(res1){ 
     secondRequest(function(res2){ 
     thirdRequest(function(res3){ 
      console.log("finished"); 
     }) 
     }); 
    } 
}); 


function secondRequest(callback) { 
    $.ajax({ 
      // other parameters 
      success:callback || noop 
    }); 
} 


function thirdRequest(callback) { 
    $.ajax({ 
      // other parameters 
     success:callback || noop 
    }); 
} 

常数:随着回调方法,我们正在编写嵌套的,所以你不能完成第一次请求之前发送第二请求给服务器回调函数。

也可能要看看deferred也。

相关问题