2014-10-07 15 views
1

我有這樣的代碼jQuery的每個(),內阿賈克斯後一個過程中的一個comepletes

$("[input]").each(function(){ 
    var data = $(this).val(); 
    $.post('someurl.php',{data:data},function(result){ 
    alert(result); 
    }); 
}); 

現在,當我打開我的網絡選項卡,後Ajax請求似乎是同時開始的,但我想實現逐個。這意味着當一個Ajax請求完成時,我希望each()等待再次循環。

我該如何做到這一點?

+0

ajax僅代表異步。 – divakar 2014-10-07 03:57:15

+0

提醒一下:AJAX中的第一個** A **代表** Asynchronous **。 – 2014-10-07 03:58:03

回答

7

正是因爲AJAX的異步性,你可以嘗試是一樣的東西

process($("[input]")); 

function process($inputs) { 
    if (!$inputs.length) { 
     return; 
    } 

    var $input = $inputs.eq(0); 
    var data = $input.val(); 

    $.post('someurl.php', { 
     data: data 
    }, function (result) { 
     console.log(result); 
    }).always(function() { 
     process($inputs.slice(1)) 
    }); 
} 

演示:Fiddle

+0

與async false有什麼不同? – Khamidulla 2014-10-07 04:02:27

+1

@Phoenix async false會阻止瀏覽器...在這裏沒有阻塞...一旦異步請求完成,第二個發送 – 2014-10-07 04:06:44

+0

我投票刪除我的回答贊成這一個,這有點更優雅,並且在有錯誤時做OP。 – 2014-10-07 04:50:10

2

我建議你把那些inputsform然後用$('form').serialize()送他們全部到服務器一次...以防萬一你希望做的更快一點,你想避免重複調用服務器 ...

除非你真的有一個送他們一個,那麼你可以循環到服務器進行多個通話可以SLOW您的系統,如果你碰巧有哪些許多input領域

喜歡的東西這使得該服務器的單個呼叫:

<form> 
<input name='input_1' /> 
. 
... 

... 

... 


... 


... 
<input name='input_1000' /> 

</form> 

的jQuery:

var myForm = $('form') 

$.post(
     'someurl.php', //The link to your .php file with a $_POST 

    { 
     data: myForm.serialize() //Serialize the form with its 1000 input fields 
    }, function (result) { 

///Handle Errors and others here. 

     console.log(result); 
    }) 
+1

這實際上是所有人中最明智的答案......但是OP必須有他的理由 – xShirase 2014-10-07 04:06:34

+0

當然,只要他不知道他可以簡單地將它們序列化成一個「形式」......這個建議可能派上用場 – ErickBest 2014-10-07 04:08:21

+0

實際上,發送所有數據將立即輸出一次數據。我需要爲每個請求輸出數據。如果在後端發生錯誤,它將在不中斷其餘進程的情況下輸出。 :) – 2014-10-07 04:09:51