摘要:前一陣子,需求中有這樣一個(gè)場景訪問一個(gè)頁面,然后需要封裝為一個(gè)方法,這個(gè)方法需要返回訪問這個(gè)頁面的結(jié)果。大概把需求抽象一下就可以變成一個(gè)方法需要返回一個(gè)異步的結(jié)果。如果不是,會(huì)被轉(zhuǎn)成一個(gè)立即的對象。
前一陣子,需求中有這樣一個(gè)場景:
訪問一個(gè)頁面,然后需要封裝為一個(gè)方法,這個(gè)方法需要返回訪問這個(gè)頁面的結(jié)果。大概把需求抽象一下就可以變成:一個(gè)方法 fn 需要返回一個(gè)異步的結(jié)果。直觀的用代碼體現(xiàn):
function fn(){ setTimeout(()=>{ return 5 },200) } fn()
如果直接這樣寫,可以看到返回的是 undefined。因?yàn)?fn 本身并沒有返回值。代碼中的 return 實(shí)際上是異步回調(diào)的返回值,沒有什么意義。
那我試著用 promise 來包裝一下這個(gè)異步的過程:
function fn(){ let p = new Promise(res=>{ setTimeout(()=>{ res(5) },200) }) return p } fn()
這時(shí)候,我們可以看到返回的是一個(gè) pending 的 promise 對象。然后我們加上神奇的 await:
await fn()
可以看到返回就是我們的預(yù)期了。
然后,我們查閱文檔看下 await 的介紹:
await 命令 正常情況下,await命令后面是一個(gè) Promise 對象。如果不是,會(huì)被轉(zhuǎn)成一個(gè)立即resolve的 Promise
對象。
這就不難理解為什么這樣寫可以實(shí)現(xiàn)我們的預(yù)期了。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/96968.html
摘要:學(xué)習(xí)開發(fā),無論是前端開發(fā)還是都避免不了要接觸異步編程這個(gè)問題就和其它大多數(shù)以多線程同步為主的編程語言不同的主要設(shè)計(jì)是單線程異步模型。由于異步編程可以實(shí)現(xiàn)非阻塞的調(diào)用效果,引入異步編程自然就是順理成章的事情了。 學(xué)習(xí)js開發(fā),無論是前端開發(fā)還是node.js,都避免不了要接觸異步編程這個(gè)問題,就和其它大多數(shù)以多線程同步為主的編程語言不同,js的主要設(shè)計(jì)是單線程異步模型。正因?yàn)閖s天生的與...
摘要:回調(diào)函數(shù),一般在同步情境下是最后執(zhí)行的,而在異步情境下有可能不執(zhí)行,因?yàn)槭录]有被觸發(fā)或者條件不滿足。同步方式請求異步同步請求當(dāng)請求開始發(fā)送時(shí),瀏覽器事件線程通知主線程,讓線程發(fā)送數(shù)據(jù)請求,主線程收到 一直以來都知道JavaScript是一門單線程語言,在筆試過程中不斷的遇到一些輸出結(jié)果的問題,考量的是對異步編程掌握情況。一般被問到異步的時(shí)候腦子里第一反應(yīng)就是Ajax,setTimse...
摘要:簽訂協(xié)議的兩方分別是異步接口和。在異步函數(shù)中,使用異常捕獲的方案,代替了的異常捕獲的方案。需要注意的是,在異步函數(shù)中使異步函數(shù)用時(shí)要使用,不然異步函會(huì)被同步執(zhí)行。 同步與異步 通常,代碼是由上往下依次執(zhí)行的。如果有多個(gè)任務(wù),就必需排隊(duì),前一個(gè)任務(wù)完成,后一個(gè)任務(wù)才會(huì)執(zhí)行。這種執(zhí)行模式稱之為: 同步(synchronous) 。新手容易把計(jì)算機(jī)用語中的同步,和日常用語中的同步弄混淆。如,...
摘要:所謂異步,就是調(diào)用在發(fā)出后,這個(gè)調(diào)用就直接返回了,調(diào)用者不會(huì)立即得到結(jié)果,但是不會(huì)阻塞,可以繼續(xù)執(zhí)行后續(xù)操作,而被調(diào)用者執(zhí)行得到結(jié)果后通過狀態(tài)事件來通知調(diào)用者使用回調(diào)函數(shù)來處理這個(gè)結(jié)果。另外狀態(tài)的回調(diào)函數(shù)是可省略的。 首先明確一個(gè)問題,為什么 Node.js 需要異步編程? JavaScript 是單線程的,在發(fā)出一個(gè)調(diào)用時(shí),在沒有得到結(jié)果之前,該調(diào)用就不返回,意思就是調(diào)用者主動(dòng)等待...
摘要:回調(diào)函數(shù)是在異步操作完成后傳播其操作結(jié)果的函數(shù),總是用來替代同步操作的返回指令。下面的圖片顯示了中事件循環(huán)過程當(dāng)異步操作完成時(shí),執(zhí)行權(quán)就會(huì)交給這個(gè)異步操作開始的地方,即回調(diào)函數(shù)。 本系列文章為《Node.js Design Patterns Second Edition》的原文翻譯和讀書筆記,在GitHub連載更新,同步翻譯版鏈接。 歡迎關(guān)注我的專欄,之后的博文將在專欄同步: Enc...
摘要:大家都一直在嘗試使用更好的方案來解決這些問題。這是一個(gè)用同步的思維來解決異步問題的方案。當(dāng)我們發(fā)出了請求,并不會(huì)等待響應(yīng)結(jié)果,而是會(huì)繼續(xù)執(zhí)行后面的代碼,響應(yīng)結(jié)果的處理在之后的事件循環(huán)中解決。我們可以用一個(gè)兩人問答的場景來比喻異步與同步。 在實(shí)際開發(fā)中總會(huì)遇到許多異步的問題,最常見的場景便是接口請求之后一定要等一段時(shí)間才能得到結(jié)果,如果遇到多個(gè)接口前后依賴,那么問題就變得復(fù)雜。大家都一直...
閱讀 2247·2021-11-23 09:51
閱讀 1042·2021-11-18 10:02
閱讀 3434·2021-10-13 09:49
閱讀 1262·2021-09-22 14:57
閱讀 10391·2021-08-18 10:20
閱讀 1181·2019-08-30 15:55
閱讀 2225·2019-08-29 16:06
閱讀 3232·2019-08-29 11:14