理解 ES6 中的 Promise

cart 9年前發布 | 13K 次閱讀 Promise 前端技術 ECMAScript

這篇文章我嘗試從感性的角度來理解一下 Promise,舉一個栗子。

小明來到火車站,跟售票員說:“我要一張廣州到杭州的高鐵票”,售票員說:“你等等,我查一下!”

上面這個場景,售票員對小明說的這句話就是一個 “承諾” ,告訴小明,我會替你查一下,看看有沒有,如果有余票,就告訴你有,沒有就告訴你沒有。

那么,小明是怎么得到這個 “承諾” 的呢?

小明得到這個“承諾”是因為小明告訴了售票員,他要一張火車票。

創建 Promise 實例

那么,在 JavaScript 里要得到一個 Promise 要怎么做呢?答案就是創建一個 Promise 實例。

下面,我們可以來看一下語法了

var promise = new Promise(executor)
var promise = new Promise(function(resolve, reject){ ... })

executor (遺囑執行者),這是個很形象地參數名。

  1. executor 是一個函數,帶有 resolve 、 reject 兩個參數
  2. executor 在創建實例的時候立即執行
  3. executor 在執行的時候會把并把 成功回調函數 和 失敗回調函數 作為參數傳遞進來,賦值給 resolve 和 reject
  4. executor 里面調用 resolve 和 reject 會分別觸發 promise 的 成功 或 失敗

有同學可能會問,創建一個 Promise 實例跟小明買票有什么關系?

現在我們用代碼來描述一下小明買票的故事。

/*
 * 比如說寫代碼的人 我 是 小明
 * Promise實例 是 “承諾”
 * executor 就是 售票員
 */

// 我是小明,我要買票,你幫我查查有沒有票
var promise = new Promise(function (resolve, reject){
 // 先起來去喝個水
 drink()
 // 吃個飯
 eat()
 // 現在搜一下 廣州到杭州 的車票
 var result = search('廣州-杭州')
 // 如果搜到有車票,就告訴小明有票
 if (result !== null) {
 resolve()
 }
 // 如果沒有搜到車票,就告訴小明沒有票了
 else {
 reject()
 }
})

小明說要買票,售票員馬上就告訴小明“你等等,我查一下!”,給了他這個承諾,這個過程是同步的。而售票員給了小明這個承諾之后,再到告訴小明有票還是沒票,這個過程明顯是異步的,因為中間售票員還去了喝水吃飯…,查票也需要時間;也可以是同步的,售票員聽到之后馬上告訴小明,沒票了~~

executor 做的事情跟售票員很像,就是將 Promise實例 的狀態變為 成功 或者 失敗 ,在此之前可以執行任何操作(只要不報錯~~);就像售票員一樣,就是要告訴小明有票還是沒票,他中間可以做任何事情。

Promise.prototype.then

看到這里,或許大家都會有個疑問:小明被告知有票或者沒票之后可以做什么?

 

來自:http://mertensming.github.io/2016/11/21/promise-practice/

 

 本文由用戶 cart 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!