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