您好,登錄后才能下訂單哦!
有的時(shí)候同一個(gè)頁(yè)面被可能同時(shí)產(chǎn)生多個(gè)ajax請(qǐng)求,為了用戶體驗(yàn),最好是發(fā)送并行請(qǐng)求,這就產(chǎn)生了并發(fā)問(wèn)題,應(yīng)該如何處理?
這種方法是最簡(jiǎn)單的了,就是在一個(gè)請(qǐng)求執(zhí)行完后在執(zhí)行另一個(gè)請(qǐng)求。代碼如下:
functionasync1() { //do sth... async2(); } functionasync2() { //do sth... } async1();
var url1,url2; $.ajax({ url: url1, async: false }); $.ajax({ url: url2, async: false });
很顯然,這種方法會(huì)需要比較長(zhǎng)的等待時(shí)間,用戶體驗(yàn)不是很好。
就是使用一個(gè)標(biāo)志位標(biāo)記請(qǐng)求是否已經(jīng)完成
這種方法會(huì)影響性能,盡量少用:
var cnt =0; functionasync1() { //do sth... cnt++; } function async2() { //do sth... cnt++; } async1(); async2(); var interval = setInterval(function(){ if (2 === cnt) { console.log('已執(zhí)行完成'); clearInterval(interval) } }, 0);
var cnt = 0; function async1() { //do sth... callback(); } function async2() { //do sth... callback(); } function callback() { cnt++; if (2 == cnt) console.log('都已執(zhí)行完畢'); } async1(); async2();
若使用第三方框架實(shí)現(xiàn),則要看第三方的相關(guān)文檔:
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 + '已完成'); });
//下面是關(guān)于同時(shí)發(fā)起多個(gè)請(qǐng)求時(shí)的處理 axios.all([get1(),get2()]) .then(axios.spread(function(res1,res2) { // 只有兩個(gè)請(qǐng)求都完成才會(huì)成功,否則會(huì)被catch捕獲 }));
還有很多框架都可以,比如Angular的$wacth等等
使用ES6中的promise、asyn、await等應(yīng)該都可以實(shí)現(xiàn),由于本人尚未使用過(guò),暫時(shí)不講,到時(shí)候再補(bǔ)充。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。