2013-04-03 50 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也。

相關問題