近來參加校招筆試,發現有好幾道關於Promise的題目。然而我都沒有了解過。因此,這篇文章以網易筆試的一道題開始,記錄關於Promise的那些事。
文章地址:http://lsxj615.com/2016/08/04...promise
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 對象用於異步(asynchronous)計算.。一個Promise對象表明着一個還未完成,但預期未來會完成的操做。
Promise 對象是一個返回值的代理,這個返回值在promise對象建立時未必已知。它容許你爲異步操做的成功或失敗指定處理方法。 這使得異步方法能夠像同步方法那樣返回值:異步方法會返回一個包含了原返回值的 promise 對象來替代原返回值。async
使用new
來調用Promise
的構造器進行實例化函數
var promise = new Promise(function(resolve, reject){ //異步處理 //處理結束後,調用resolve或reject });
對經過new生成的promise對象爲了設置其在resolve(成功)/reject(失敗)時調用的回調函數可使用promise.then()
實例方法spa
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()
來處理。兩者效果相同。code
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()
ip
Promise.resolve()
ci
Promise.reject()
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(value)
可認爲是new Promise()
方法的快捷方式
Promise.value(value); //等同於如下代碼 new Promise(function(resolve){ resolve(value); });
此時這個promise對象會進入fulfilled
狀態。而resolve(value)
中的value
會傳遞給後面then
中指定的onFulfilled
函數。
Promise.resolve(value)
返回值也是一個promise對象,因此能夠進行鏈式調用.
Promise.reject(error)
與上述靜態方法相似,也是new Promise()
方法的快捷方式
Promise.reject(new Error("出錯了")); //等同於如下代碼 new Promise(function(resolve, reject){ reject(new Error("出錯了")); });
這段代碼則是調用該promise對象經過then
指定的onRejected
函數,並將錯誤對象(Error)傳遞給onRejected
函數。
話很少說,貼圖就是。
能夠知道,當promise調用了reject(true)
方法,則傳遞true
這個參數給'then'指定的onRejected
函數,即題目中的function(){console.log(3);}
。但因爲.then
中指定的方法調用是異步執行的,因此會先執行console.log(4);
本篇文章僅是簡單介紹promise。欲瞭解更多內容,可查看如下資料。謝謝~
資料來源: