摘要:對象是一個返回值的代理,這個返回值在對象創建時未必已知。這使得異步方法可以像同步方法那樣返回值異步方法會返回一個包含了原返回值的對象來替代原返回值。
前言
近來參加校招筆試,發現有好幾道關于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的API ConstructorPromise 對象用于異步(asynchronous)計算.。一個Promise對象代表著一個還未完成,但預期將來會完成的操作。
Promise 對象是一個返回值的代理,這個返回值在promise對象創建時未必已知。它允許你為異步操作的成功或失敗指定處理方法。 這使得異步方法可以像同步方法那樣返回值:異步方法會返回一個包含了原返回值的 promise 對象來替代原返回值。
使用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.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
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。欲了解更多內容,可查看以下資料。謝謝~
資料來源:
Promise- Javascipt | MDN
JavaScript Promise迷你書(中文版)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/90867.html
摘要:如果你要問他和誰當進去的快,要從下面兩個方面考慮結束時。至于什么,查了很多的資料,了解到一個瀏覽器環境只能有一個事件循環,而一個事件循環可以有多個任務隊列。 ====據說這是今日頭條去年的一道筆試題,主要考察的是setTimeout async promise執行順序 ~先雙手奉上這道題目~ async function async1() { consol...
摘要:前兩天做了一份筆試題按照執行順序列出下面代碼的打印內容可能有些小朋友會被里面那個立即執行函數嚇傻。和將指向改變至,也就是了。 前兩天做了一份筆試題:按照執行順序列出下面代碼的打印內容 var name = The Window; var object = { name : The Object, getNameFunc : function(){ (()...
摘要:注意點這個代碼是嚴格依賴環境的,例如中和是連續的,在編譯器中,和之間有一個空間。注意點當把與交換之后,程序將不會出現死循環,但是程序的越界訪問報錯是少不了的。注意點這種優化是無差別的,即無論你的代碼是否越界,都會進行這樣的優化。 目錄 聲明 原題 題目詳細解析 運行結果: 題目...
摘要:前言接上篇前端筆試題面試題記錄上。默認值,不脫離文檔流,,,,等屬性不生效。。不脫離文檔流,依據自身位置進行偏離,當子元素設置,將依據它進行偏離。。 前言 接上篇前端筆試題面試題記錄(上)。趁清明小長假,把上篇剩下的部分也寫一下,因為最近比較忙這篇已經拖了很久了?,F在剛剛開始銀四了,應該還是有些小伙伴在找工作,時間還不算太晚,希望本篇可以幫到這些小伙伴。 個人博客了解一下:obkoro...
摘要:前言接上篇前端筆試題面試題記錄上。默認值,不脫離文檔流,,,,等屬性不生效。。不脫離文檔流,依據自身位置進行偏離,當子元素設置,將依據它進行偏離。。 前言 接上篇前端筆試題面試題記錄(上)。趁清明小長假,把上篇剩下的部分也寫一下,因為最近比較忙這篇已經拖了很久了。現在剛剛開始銀四了,應該還是有些小伙伴在找工作,時間還不算太晚,希望本篇可以幫到這些小伙伴。 個人博客了解一下:obkoro...
閱讀 1309·2021-09-27 13:56
閱讀 2338·2019-08-26 10:35
閱讀 3497·2019-08-23 15:53
閱讀 1848·2019-08-23 14:42
閱讀 1233·2019-08-23 14:33
閱讀 3562·2019-08-23 12:36
閱讀 1947·2019-08-22 18:46
閱讀 996·2019-08-22 14:06