一道笔试题引发的Promise笔记
前言
近來參加校招筆試,發現有好幾道關于Promise的題目。然而我都沒有了解過。所以,這篇文章以網易筆試的一道題開始,記錄關于Promise的那些事。
文章地址:http://lsxj615.com/2016/08/04...
筆試題
console.log(1); new Promise(function (resolve, reject){reject(true);window.setTimeout(function (){resolve(false);}, 0); }).then(function(){console.log(2); }, function(){console.log(3); }); console.log(4);請問輸出結果是什么?在揭曉答案之前,我們還是先來了解一下Promise吧。
Promise是什么
Promise 對象用于異步(asynchronous)計算.。一個Promise對象代表著一個還未完成,但預期將來會完成的操作。
Promise 對象是一個返回值的代理,這個返回值在promise對象創建時未必已知。它允許你為異步操作的成功或失敗指定處理方法。 這使得異步方法可以像同步方法那樣返回值:異步方法會返回一個包含了原返回值的 promise 對象來替代原返回值。
Promise的API
Constructor
使用new來調用Promise的構造器進行實例化
var promise = new Promise(function(resolve, reject){//異步處理//處理結束后,調用resolve或reject });Instance Method
對通過new生成的promise對象為了設置其在resolve(成功)/reject(失敗)時調用的回調函數可以使用promise.then()實例方法
promise.then(onFulfilled, onRejected); //以防誤解,上述的即為以下這種形式 promise.then(function(){...}, function(){...});當resolve(成功)時,會調用onFulfilled函數;
reject(失敗)時,會調用onRejected函數。
這也對應了前面筆試題中,onFulfilled其實就是console.log(2),也就是說成功時會調用console.log(2),而失敗時,onRejected就是調用console.log(3)。
若只想處理異常情況的函數,可promise.then(undefined, onRejected),當然更好的選擇是用promise.catch()來處理。二者效果相同。
promise.then(function (value) {console.log(value); }).catch(function (error) {console.log(error); });//等同于以下形式 promise.then(function (value) {console.log(value); }, function (error) {console.log(error); });其他方法
Promise.all()
Promise.race()
Promise.resolve()
Promise.reject()
Promise的狀態
Promise對象有三種狀態
pending 初始狀態,既不是fulfilled也不是rejected
fulfilled 成功。此時調用onFulfilled
rejected 失敗。此時調用onRejected
Fulfilled和Rejected都可以表示為Settled。
由下圖可以了解,最初Promise為pending狀態,在執行后轉為settled狀態,而settled狀態分為兩種:在成功后轉為fulfilled,執行.then(onFulfilled)方法;在失敗后轉為reject,執行.then(onRejecttion)或.catch(onRejecttion),進行異步操作,再返回Promise對象,轉為pending狀態。
Promise.resolve & Promise.reject
-
Promise.resolve
Promise.resolve(value)可認為是new Promise()方法的快捷方式
此時這個promise對象會進入fulfilled狀態。而resolve(value)中的value會傳遞給后面then中指定的onFulfilled函數。
Promise.resolve(value)返回值也是一個promise對象,所以可以進行鏈式調用.
-
Promise.reject
Promise.reject(error)與上述靜態方法類似,也是new Promise()方法的快捷方式
這段代碼則是調用該promise對象通過then指定的onRejected函數,并將錯誤對象(Error)傳遞給onRejected函數。
筆試題解答
話不多說,貼圖就是。
可以知道,當promise調用了reject(true)方法,則傳遞true這個參數給'then'指定的onRejected函數,即題目中的function(){console.log(3);}。但由于.then中指定的方法調用是異步執行的,所以會先執行console.log(4);
本篇文章僅是簡單介紹promise。欲了解更多內容,可查看以下資料。謝謝~
資料來源:
Promise- Javascipt | MDN
JavaScript Promise迷你書(中文版)
總結
以上是生活随笔為你收集整理的一道笔试题引发的Promise笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android 进程间通信
- 下一篇: cpu和memory性能监控