摘要:在前端這個(gè)領(lǐng)域里面,請(qǐng)求非常常見(jiàn),相信每一個(gè)前端都寫過(guò)下面的代碼前提引入上面這段代碼中的和被稱為回調(diào)函數(shù)。多個(gè)請(qǐng)求希望有一個(gè)共同的回調(diào)響應(yīng)繼續(xù)使用最初的方法,假設(shè)有多個(gè)請(qǐng)求,希望在全部完成后執(zhí)行回調(diào)函數(shù)。異步編程延遲對(duì)象篇
在前端這個(gè)領(lǐng)域里面,ajax請(qǐng)求非常常見(jiàn),相信每一個(gè)前端er都寫過(guò)下面的代碼:
// 前提引入jquery $.ajax({ type: "get", url: "/path/to/data", success: function (response) { }, error: function (errMsg) { } })
上面這段代碼中的success和error被稱為回調(diào)函數(shù)?;趈s異步IO的特點(diǎn),代碼的意思就是在ajax請(qǐng)求成功之后,執(zhí)行success函數(shù),而在ajax失敗時(shí),執(zhí)行error函數(shù)。
然而在有些情況下,業(yè)務(wù)邏輯可能需要我們產(chǎn)生多個(gè)success狀態(tài)下的回調(diào)函數(shù),或者多個(gè)ajax請(qǐng)求同時(shí)發(fā)送,全部success狀態(tài)后執(zhí)行回調(diào),這樣的方法就顯得有些捉襟見(jiàn)肘。
1. 單次ajax請(qǐng)求有多個(gè)回調(diào)響應(yīng)
// 使用上面的方法,有如下兩種業(yè)務(wù)邏輯 $.ajax({ type: "get", url: "/path/to/data", success: function (response) { // todo successCallback2(response); successCallback3(response); } })
繼續(xù)使用上面的寫法,就會(huì)讓回調(diào)進(jìn)行嵌套,如果需要在successCallback2完成后繼續(xù)回調(diào),就要一層一層的嵌套。代碼不是縱向發(fā)展,而是橫向發(fā)展,這就是js中的回調(diào)地獄。
2. 多個(gè)ajax請(qǐng)求希望有一個(gè)共同的回調(diào)響應(yīng)
// 繼續(xù)使用最初的方法,假設(shè)有多個(gè)ajax請(qǐng)求,希望在全部完成后執(zhí)行回調(diào)函數(shù)。 function fetchData (url, successCb, errorCb) { return function () { $.ajax({ type: "get", url: url, success: successCb, error: errorCb }); } } function successCb () { console.log("success"); } function errorCb () { console.log("error"); } var fetchData1 = fetchData("/path/to/data1", successCb, errorCb); var fetchData2 = fetchData("/path/to/data2", successCb, errorCb); 如果有兩個(gè)相同的fetch data的操作,如果我們希望能夠并行操作的話,只能重寫fetchData1 var fetchData1 = fetchData("/path/to/data1", fetchData2, errorCb); fetchData1();
這種寫法實(shí)際上是在fetchData1成功后進(jìn)行fetchData2操作的,并不是嚴(yán)格意義上的并行操作,之后在fetchData2的success狀態(tài)的回調(diào)中,我們可以獲得兩次ajax請(qǐng)求的返回值。
這樣的代碼是不完美的,在如今大家都在追求webpack+es6+babel的技術(shù)棧時(shí),也應(yīng)該想想,如何從最基本的代碼中提升生產(chǎn)力和代碼的可維護(hù)性。
在發(fā)現(xiàn)了代碼在業(yè)務(wù)中的痛點(diǎn)之后,就要想辦法去解決它。好在如今前端百花齊放,這樣的問(wèn)題早已有多種成熟的解決方案,接下來(lái)的幾篇文章,就由淺入深詳細(xì)的講講這些異步方案中的實(shí)現(xiàn)方法和代碼原理,并且每一種方法本人都實(shí)現(xiàn)了一個(gè)tiny版。所有文章代碼都開(kāi)源在github上,如果有任何問(wèn)題或者建議甚至是錯(cuò)誤,都可以在github中提issue給我。歡迎大家熱烈討論。
下一篇開(kāi)始,著重介紹具體從Deferred對(duì)象解決上述兩種問(wèn)題,有興趣的同學(xué)繼續(xù)看下去吧。Javascript異步編程-延遲對(duì)象篇
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/91317.html
摘要:的翻譯文檔由的維護(hù)很多人說(shuō),阮老師已經(jīng)有一本關(guān)于的書了入門,覺(jué)得看看這本書就足夠了。前端的異步解決方案之和異步編程模式在前端開(kāi)發(fā)過(guò)程中,顯得越來(lái)越重要。為了讓編程更美好,我們就需要引入來(lái)降低異步編程的復(fù)雜性。 JavaScript Promise 迷你書(中文版) 超詳細(xì)介紹promise的gitbook,看完再不會(huì)promise...... 本書的目的是以目前還在制定中的ECMASc...
摘要:從最開(kāi)始的到封裝后的都在試圖解決異步編程過(guò)程中的問(wèn)題。為了讓編程更美好,我們就需要引入來(lái)降低異步編程的復(fù)雜性。異步編程入門的全稱是前端經(jīng)典面試題從輸入到頁(yè)面加載發(fā)生了什么這是一篇開(kāi)發(fā)的科普類文章,涉及到優(yōu)化等多個(gè)方面。 TypeScript 入門教程 從 JavaScript 程序員的角度總結(jié)思考,循序漸進(jìn)的理解 TypeScript。 網(wǎng)絡(luò)基礎(chǔ)知識(shí)之 HTTP 協(xié)議 詳細(xì)介紹 HTT...
摘要:模塊化是隨著前端技術(shù)的發(fā)展,前端代碼爆炸式增長(zhǎng)后,工程化所采取的必然措施。目前模塊化的思想分為和。特別指出,事件不等同于異步,回調(diào)也不等同于異步。將會(huì)討論安全的類型檢測(cè)惰性載入函數(shù)凍結(jié)對(duì)象定時(shí)器等話題。 Vue.js 前后端同構(gòu)方案之準(zhǔn)備篇——代碼優(yōu)化 目前 Vue.js 的火爆不亞于當(dāng)初的 React,本人對(duì)寫代碼有潔癖,代碼也是藝術(shù)。此篇是準(zhǔn)備篇,工欲善其事,必先利其器。我們先在代...
摘要:下面我將介紹的基本用法以及如何在異步編程中使用它們。在沒(méi)有發(fā)布之前,作為異步編程主力軍的回調(diào)函數(shù)一直被人詬病,其原因有太多比如回調(diào)地獄代碼執(zhí)行順序難以追蹤后期因代碼變得十分復(fù)雜導(dǎo)致無(wú)法維護(hù)和更新等,而的出現(xiàn)在很大程度上改變了之前的窘境。 前言 自己著手準(zhǔn)備寫這篇文章的初衷是覺(jué)得如果想要更深入的理解 JS,異步編程則是必須要跨過(guò)的一道坎。由于這里面涉及到的東西很多也很廣,在初學(xué) JS 的...
摘要:談起閉包,它可是兩個(gè)核心技術(shù)之一異步基于打造前端持續(xù)集成開(kāi)發(fā)環(huán)境本文將以一個(gè)標(biāo)準(zhǔn)的項(xiàng)目為例,完全拋棄傳統(tǒng)的前端項(xiàng)目開(kāi)發(fā)部署方式,基于容器技術(shù)打造一個(gè)精簡(jiǎn)的前端持續(xù)集成的開(kāi)發(fā)環(huán)境。 這一次,徹底弄懂 JavaScript 執(zhí)行機(jī)制 本文的目的就是要保證你徹底弄懂javascript的執(zhí)行機(jī)制,如果讀完本文還不懂,可以揍我。 不論你是javascript新手還是老鳥,不論是面試求職,還是日...
閱讀 1029·2021-09-26 09:55
閱讀 3593·2021-09-24 10:30
閱讀 1378·2021-09-08 09:36
閱讀 2559·2021-09-07 09:58
閱讀 610·2019-08-30 15:56
閱讀 776·2019-08-29 18:32
閱讀 3634·2019-08-29 15:13
閱讀 1850·2019-08-29 13:49