1. 程式人生 > >前端面試——回撥、Promise、Generator和async-await

前端面試——回撥、Promise、Generator和async-await

首先我們回顧一下javascript非同步的發展歷程。

ES6 以前:

  回撥函式(callback):nodejs express 中常用,ajax中常用。

ES6:

  promise物件:nodejs最早有bluebird promise的雛形,axios中常用。

  generator函式:nodejs koa框架使用率很高。

ES7:

  async/await語法:當前最常用的非同步語法,nodejs koa2 完全使用該語法。

回撥函式CALLBACK:

將一個函式當做引數傳到另一個函式裡,當那個函式執行完後,再執行傳進去的這個函式這個過程就叫做回撥。

Promise物件:

promise 物件用於一個非同步操作的最終完成(或最終失敗)及其結果的表示。

簡單地說就是處理一個非同步請求。我們經常會做些斷言,如果我贏了你就嫁給我,如果輸了我就嫁給你之類的斷言。

這就是promise的中文含義:斷言,一個成功,一個失敗。

舉個例子,方便大家理解:

promise建構函式的引數是一個函式,我們把它稱為處理器函式。

處理器函式接收兩個函式reslove和reject作為其引數,當非同步操作順利執行則執行reslove函式, 當非同步操作中發生異常時,則執行reject函式。

async-await

async函式返回一個promise物件,如果在async函式中返回一個直接量,async會通過Promise.resolve封裝成Promise物件。 我們可以通過呼叫promise物件的then方法,獲取這個直接量。

await會暫停當前async的執行,await會阻塞程式碼的執行,直到await後的表示式處理完成,程式碼才能繼續往下執行。

await後的表示式既可以是一個Promise物件,也可以是任何要等待的值。

如果await等到的是一個 Promise 物件,await 就忙起來了,它會阻塞後面的程式碼,等著 Promise 物件 resolve,然後得到 resolve 的值,作為 await 表示式的運算結果。