這篇文章主要講解了“如何解決多個(gè)Ajax請(qǐng)求執(zhí)行返回先后的問題”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“如何解決多個(gè)Ajax請(qǐng)求執(zhí)行返回先后的問題”吧!
成都創(chuàng)新互聯(lián)致力于互聯(lián)網(wǎng)品牌建設(shè)與網(wǎng)絡(luò)營(yíng)銷,包括成都網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、SEO優(yōu)化、網(wǎng)絡(luò)推廣、整站優(yōu)化營(yíng)銷策劃推廣、電子商務(wù)、移動(dòng)互聯(lián)網(wǎng)營(yíng)銷等。成都創(chuàng)新互聯(lián)為不同類型的客戶提供良好的互聯(lián)網(wǎng)應(yīng)用定制及解決方案,成都創(chuàng)新互聯(lián)核心團(tuán)隊(duì)十余年專注互聯(lián)網(wǎng)開發(fā),積累了豐富的網(wǎng)站經(jīng)驗(yàn),為廣大企業(yè)客戶提供一站式企業(yè)網(wǎng)站建設(shè)服務(wù),在網(wǎng)站建設(shè)行業(yè)內(nèi)樹立了良好口碑。
有時(shí)候在一個(gè)業(yè)務(wù)事件處理流程上,可能會(huì)遇到點(diǎn)擊了一個(gè)按鈕或者其他事件觸發(fā)了一個(gè)動(dòng)作
需要執(zhí)行兩個(gè)以上的Ajax請(qǐng)求,但是可能要顧慮到Ajax請(qǐng)求執(zhí)行的先后順序,有時(shí)候Ajax請(qǐng)求順序出問題,會(huì)導(dǎo)致各種問題
例如現(xiàn)在有兩個(gè)ajax事件,分別為ajax1 ,ajax2
一個(gè)叫做main的方法調(diào)用執(zhí)行入口
1.
function main(){ ajax1(data,callback); ajax2(data,callback); }
如果我們按照上面的方法去執(zhí)行,表面上看似乎是讓ajax1先執(zhí)行,ajax2后執(zhí)行。如果不仔細(xì)想,有些人會(huì)認(rèn)為ajax1先執(zhí)行完,之后才會(huì)執(zhí)行ajax2.事實(shí)上真的會(huì)如此嗎?
答案是 不一定 。當(dāng)然對(duì)于有多個(gè)ajax請(qǐng)求對(duì)執(zhí)行返回順序沒要求的情況,我們不需要過多考慮誰先執(zhí)行,誰先返回的
那要是考慮ajax事件執(zhí)行先后順序以及返回順序呢
要是這樣那怎么解決ajax事件的執(zhí)行返回先后順序呢
當(dāng)然現(xiàn)在你應(yīng)該會(huì)想到ajax回調(diào)函數(shù),Good,這是一個(gè)好主意
現(xiàn)在按這種思路改變一下方法,方法如下
function main(){ ajax1( data , ajax2( ) ); }
這樣看起來,你是不是覺得Very Good呢?真的嗎?真的是Very Good嗎?
Maybe,But in some case ,這樣寫可能有些不方便,當(dāng)然也許你可能不會(huì)遇到,但是我遇到了一種比較特殊的情況
比如下面這種可能
function main(){ aa(data); ajax1(data,callback); } function aa(val){ var data=val+"";//這里是對(duì)傳入數(shù)據(jù)進(jìn)行修改,封裝,當(dāng)然這里是隨便寫的 ajax2(data,ajax2Callback); } function ajax2Callback(){ console.log("=====回調(diào)函數(shù)ajax2Callback()執(zhí)行========"); console.log("=====這里正在執(zhí)行ajax執(zhí)行完畢后必須執(zhí)行的操作========"); }
你認(rèn)為這種情況可以滿足ajax2在ajax1先執(zhí)行并且先執(zhí)行完畢嗎
仔細(xì)想想你會(huì)發(fā)現(xiàn)得到答案
No!
Now ,How to solve this proplem . How to make sure ajax2 finished before ajax1 .
當(dāng)然,你可能會(huì)說,這不簡(jiǎn)單,把a(bǔ)jax1的調(diào)用放進(jìn)ajax2方法回調(diào)方法ajax2Callback的最后面
不得不承認(rèn)這是一種解決方案,但是如果是一個(gè)很古老的項(xiàng)目,已經(jīng)做了好幾年的項(xiàng)目了。里面調(diào)用復(fù)雜,要盡量去避免修改以前的底層方法,也許你為了修改這個(gè)bug,就這樣簡(jiǎn)單解決了,你可能又會(huì)創(chuàng)造多個(gè)bug.
那到底還有沒有好的方法去解決了?
Sure,solve it easy .但是工作經(jīng)驗(yàn)不足的人很少會(huì)一下想到,只會(huì)用前面的辦法草草解決問題,不管三七二十一。
而我采用了一種比較笨的方法,而且還存在一定問題,使用了setTimeOut定時(shí)器執(zhí)行一次,但是問題想必大家都知道,誰知道這個(gè)Ajax會(huì)執(zhí)行多久了,還好有大神指導(dǎo)了下我,
還記得對(duì)數(shù)組排序嗎,說道這個(gè),也許你會(huì)好奇,這與數(shù)組排序有啥關(guān)系。下面會(huì)告訴你答案
代碼說明一切:
function main(){ var temp=ajax2Callback; ajax2Callback=function(){ temp(); ajax1(data,callback); } aa(data); ajax2Callback=temp; } function aa(val){ var data=val+"";//這里是對(duì)傳入數(shù)據(jù)進(jìn)行修改,封裝,當(dāng)然這里是隨便寫的 ajax2(data,ajax2Callback); } function ajax2Callback(){ console.log("=====回調(diào)函數(shù)ajax2Callback()執(zhí)行========"); console.log("=====這里正在執(zhí)行ajax執(zhí)行完畢后必須執(zhí)行的操作========"); }
看出來沒,是不是很有趣,沒有修改最低層的方法,僅僅修改了main方法,是不是很像數(shù)組排序里的當(dāng)我們比較兩個(gè)值大小時(shí),不管你用冒泡排序,還是快速排序,是不是都設(shè)置了一個(gè)臨時(shí)變量去存儲(chǔ)值。當(dāng)然排序比較大小時(shí),你可以沒必要設(shè)置臨時(shí)變量,僅僅用一個(gè)^運(yùn)算符去做賦值比大小,甚至你可以偷懶到直接調(diào)用系統(tǒng)的Arrays.sort()方法,當(dāng)然這都可以
function changeSearchContactType(obj) { if (!obj) { return; } var contactType = obj.value; var origRenderTemplate = renderTemplate; renderTemplate = function(data) { origRenderTemplate(data); ajaxAnywhere.submitAJAX('setSearchContactType'); } var result = TemplateHelper.changeSearchContactTemplate(contactType, contactUIUID); renderTemplate = origRenderTemplate; return result; }
感謝各位的閱讀,以上就是“如何解決多個(gè)Ajax請(qǐng)求執(zhí)行返回先后的問題”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)如何解決多個(gè)Ajax請(qǐng)求執(zhí)行返回先后的問題這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!