摘要:?jiǎn)栴}的主要目的是考察對(duì)異步調(diào)用執(zhí)行結(jié)果的處理,既然是異步調(diào)用,那么不可能同步等待異步結(jié)果,結(jié)果一定是異步的經(jīng)常用來模擬異步操作。
問題
原題來自 @若澤 的提問。
可修改下面的 aa() 函數(shù),目的是在一秒后用 console.log() 輸出 want-value
function aa() { setTimeout(function() { return "want-value"; }, 1000); }
但是,有額外要求:
aa() 函數(shù)可以隨意修改,但是不能有 console.log()
執(zhí)行 console.log() 語句里不能有 setTimeout 包裹
解答也許這是個(gè)面試題,管它呢。問題的主要目的是考察對(duì)異步調(diào)用執(zhí)行結(jié)果的處理,既然是異步調(diào)用,那么不可能同步等待異步結(jié)果,結(jié)果一定是異步的
setTimeout() 經(jīng)常用來模擬異步操作。最早,異步是通過回調(diào)來通知(調(diào)用)處理程序處理結(jié)果的
function aa(callback) { setTimeout(function() { if (typeof callback === "function") { callback("want-value"); } }, 1000); } aa(function(v) { console.log(v); });
不過回調(diào)在用于稍大型一點(diǎn)的異步應(yīng)用時(shí),容易出現(xiàn)多層嵌套,所以之后提出了一些對(duì)其進(jìn)行“扁平”化,這一部分可以參考閑談異步調(diào)用“扁平”化。當(dāng)然 Promise 是非常流行的一種方法,并最終被 ES6 采納。用 Promise 實(shí)現(xiàn)如下:
function aa() { return new Promise(resolve => { setTimeout(function() { resolve("want-value"); }, 1000); }); } aa().then(v => console.log(v));
就這個(gè)例子來說,它和前面回調(diào)的例子大同小異。不過它會(huì)引出目前更推薦的一種方法——async/await,從 ES2017 開始支持:
function aa() { return new Promise(resolve => { setTimeout(function() { resolve("want-value"); }, 1000); }); } async function main() { const v = await aa(); console.log(v); } main();
aa() 的定義與 Promise 方法中的定義是一樣的,但是在調(diào)用的時(shí)候,使用了 await,異步等待,等待到異步的結(jié)果之后,再使用 console.log() 對(duì)其進(jìn)行處理。
這里需要注意的是 await 只能在 async 方法中使用,所以為了使用 await 必須定義一個(gè) async 的 main 方法,并在全局作用域中調(diào)用。由于 main 方法是異步的(申明為 async),所以如果 main() 調(diào)用之后還有其它語句,比如 console.log("hello"),那么這一句話會(huì)先執(zhí)行。
async/await 語法讓異步調(diào)用寫起來像寫同步代碼,在編寫代碼的時(shí)候,可以避免邏輯跳躍,寫起來會(huì)更輕松。(參考:從地獄到天堂,Node 回調(diào)向 async/await 轉(zhuǎn)變)
當(dāng)然,定義 main() 再調(diào)用 main() 這部分可以用 IIFE 封裝一下,
(async () => { const v = await aa(); console.log(v); })();
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/89307.html
摘要:前端日?qǐng)?bào)精選中的生命周期函數(shù)淺談圖像優(yōu)化強(qiáng)推見效表示使用率不斷升高認(rèn)識(shí)屏幕加載骨架專題系列二十篇正式完結(jié)中文插件使用在中實(shí)現(xiàn)下拉加載數(shù)據(jù),瀑布流,詳細(xì)操作前端學(xué)習(xí)分鐘前端國際化掘金周刊盒模型詳解掘金,從玩玩具的心態(tài)開始,到打 2017-10-25 前端日?qǐng)?bào) 精選 React中的async/await生命周期函數(shù)淺談Web圖像優(yōu)化強(qiáng)推 HTTPS 見效?Google 表示 HTTPS 使...
摘要:和異步處理調(diào)用訪問數(shù)據(jù)采用的方式,這是一個(gè)異步過程,異步過程最基本的處理方式是事件或回調(diào),其實(shí)這兩種處理方式實(shí)現(xiàn)原理差不多,都需要在調(diào)用異步過程的時(shí)候傳入一個(gè)在異步過程結(jié)束的時(shí)候調(diào)用的接口。 Ajax 和異步處理 調(diào)用 API 訪問數(shù)據(jù)采用的 Ajax 方式,這是一個(gè)異步過程,異步過程最基本的處理方式是事件或回調(diào),其實(shí)這兩種處理方式實(shí)現(xiàn)原理差不多,都需要在調(diào)用異步過程的時(shí)候傳入一個(gè)在異...
摘要:進(jìn)擊的巨人第三篇,本篇就作用域作用域鏈閉包等知識(shí)點(diǎn),一一擊破。在此我們遵照的方式,暫且稱是閉包。所以,一名合格的前端,除了會(huì)用閉包,還要正確的解除閉包引用。 進(jìn)擊的巨人第三篇,本篇就作用域、作用域鏈、閉包等知識(shí)點(diǎn),一一擊破。 showImg(https://segmentfault.com/img/bVburWd?w=1280&h=854); 作用域 作用域:負(fù)責(zé)收集并維護(hù)由所有聲明的...
摘要:適當(dāng)引導(dǎo)面試官。如果有機(jī)會(huì)來實(shí)習(xí),如何最有效的快速成長(zhǎng)淘寶技術(shù)部前端內(nèi)部有針對(duì)新同學(xué)的前端夜校,有專門的老師授課。 阿里巴巴2019前端實(shí)習(xí)生招聘還剩最后兩周,面向2019年11月1日至2020年10月31日之間畢業(yè)的同學(xué),在這里分享下阿里前端面試考核的關(guān)鍵點(diǎn): Q:在面試過程中,前端面試官如何考核面試者?A:會(huì)看同學(xué)為什么選擇前端行業(yè)?是因?yàn)樗惴ㄌy?Java、C++太難?還是因?yàn)闊?..
摘要:具體調(diào)用鏈路如圖函數(shù)主要是解析啟動(dòng)參數(shù),并過濾選項(xiàng)傳給引擎。查閱文檔之后發(fā)現(xiàn),通過指定參數(shù)可以設(shè)置線程池大小。原來的字節(jié)碼編譯優(yōu)化還有都是通過多線程完成又繼續(xù)深入調(diào)查,發(fā)現(xiàn)環(huán)境變量會(huì)影響的線程池大小。執(zhí)行過程如下調(diào)用執(zhí)行。 作者:正龍 (滬江Web前端開發(fā)工程師)本文原創(chuàng),轉(zhuǎn)載請(qǐng)注明作者及出處。 隨著Node.js的普及,越來越多的開發(fā)者使用Node.js來搭建環(huán)境,也有很多公司開始把...
閱讀 1383·2021-11-16 11:44
閱讀 3908·2021-10-09 10:01
閱讀 1855·2021-09-24 10:31
閱讀 4159·2021-09-04 16:41
閱讀 2604·2021-08-09 13:45
閱讀 1321·2019-08-30 14:08
閱讀 1912·2019-08-29 18:32
閱讀 1720·2019-08-26 12:12