請求多並發
阿新 • • 發佈:2017-06-27
前端 請求 ajax 並發 第三方框架實現
有的時候同一個頁面被可能同時產生多個ajax請求,為了用戶體驗,最好是發送並行請求,這就產生了並發問題,應該如何處理?
並行改串行
這種方法是最簡單的了,就是在一個請求執行完後在執行另一個請求。代碼如下:
1)在回調中執行下一請求
functionasync1() { //do sth... async2(); } functionasync2() { //do sth... } async1();
2)將 ajax 改為同步,按順序執行
var url1,url2; $.ajax({ url: url1, async: false }); $.ajax({ url: url2, async: false });
很顯然,這種方法會需要比較長的等待時間,用戶體驗不是很好。
使用計數器
就是使用一個標誌位標記請求是否已經完成
1)循環非阻塞
這種方法會影響性能,盡量少用:
var cnt =0; functionasync1() { //do sth... cnt++; } function async2() { //do sth... cnt++; } async1(); async2(); var interval = setInterval(function(){ if (2 === cnt) { console.log(‘已執行完成‘); clearInterval(interval) } }, 0);
2) 回調計數
var cnt = 0; function async1() { //do sth... callback(); } function async2() { //do sth... callback(); } function callback() { cnt++; if (2 == cnt) console.log(‘都已執行完畢‘); } async1(); async2();
第三方框架實現
若使用第三方框架實現,則要看第三方的相關文檔:
1)jquery
var d1 =$.Deferred(); var d2 =$.Deferred(); functionasync1() { d1.resolve("Fish"); } functionasync2() { d2.resolve("Pizza"); } async1(); async2(); $.when(d1,d2).done(function(v1, v2) { console.log(v1 + v2 + ‘已完成‘); });
2)axios
//下面是關於同時發起多個請求時的處理 axios.all([get1(),get2()]) .then(axios.spread(function(res1,res2) { // 只有兩個請求都完成才會成功,否則會被catch捕獲 }));
還有很多框架都可以,比如Angular的$wacth等等
ES6來實現
使用ES6中的promise、asyn、await等應該都可以實現,由於本人尚未使用過,暫時不講,到時候再補充。
本文出自 “前端工程獅” 博客,請務必保留此出處http://xiedr.blog.51cto.com/12552842/1942338
請求多並發