jQuery Deferred 可以讓 user 達到同時使用許多 Ajax request 時,等待所有 request 完成後再執行功能的目的,大部分的範例都是這樣:
$.when($.ajax('xxx.php'), $.ajax('xxx.php')) .done(function() { cosnole.log('all done'); });
程式會等到兩個 Ajax 都執行完畢後才觸發 console log
,假設今天我們遇到的情況符合以下條件:
- 超過兩個以上的 ajax request
- 有一定的邏輯
我們不會希望有十個 request 就在裡面塞十次 code,可以利用一種寫法來達到這個目的
deferred.js
$(function() { load() .done(function() { console.log('all done'); }) function load() { var results = []; for (i = 1; i <= 3; i++) { result = $.get('ajax.php').done(function(i) { console.log(i + ' is done'); }); results.push(result); } return $.when.apply($, results); } })
ajax.php
<? sleep(2); echo rand(1, 999);
js 的範例是指呼叫了 ajax.php 三次,當 array 完成時,回傳 $.when.apply
的結果,使用這個 function 會將所有完成的行為視為 deferred 物件傳回,所以 done
就會有所反應,當然也可以寫成這樣:
$(function() { var results = []; for (i = 1; i < 3; i++) { result = $.get('ajax.php').done(function(i) { console.log(i + ' is done'); }); results.push(result); } $.when.apply($, results).done(function() { console.log('all done'); }); })
寫成 function 彈性比較大一點,得到的結果如下
923 is done 144 is done all done
沒有留言:
張貼留言