摘要:對象是一個返回值的代理,這個返回值在對象創(chuàng)建時未必已知。這使得異步方法可以像同步方法那樣返回值異步方法會返回一個包含了原返回值的對象來替代原返回值。
前言
近來參加校招筆試,發(fā)現(xiàn)有好幾道關(guān)于Promise的題目。然而我都沒有了解過。所以,這篇文章以網(wǎng)易筆試的一道題開始,記錄關(guān)于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);
請問輸出結(jié)果是什么?在揭曉答案之前,我們還是先來了解一下Promise吧。
Promise是什么Promise的API ConstructorPromise 對象用于異步(asynchronous)計算.。一個Promise對象代表著一個還未完成,但預(yù)期將來會完成的操作。
Promise 對象是一個返回值的代理,這個返回值在promise對象創(chuàng)建時未必已知。它允許你為異步操作的成功或失敗指定處理方法。 這使得異步方法可以像同步方法那樣返回值:異步方法會返回一個包含了原返回值的 promise 對象來替代原返回值。
使用new來調(diào)用Promise的構(gòu)造器進(jìn)行實(shí)例化
var promise = new Promise(function(resolve, reject){ //異步處理 //處理結(jié)束后,調(diào)用resolve或reject });Instance Method
對通過new生成的promise對象為了設(shè)置其在resolve(成功)/reject(失敗)時調(diào)用的回調(diào)函數(shù)可以使用promise.then()實(shí)例方法
promise.then(onFulfilled, onRejected); //以防誤解,上述的即為以下這種形式 promise.then(function(){...}, function(){...});
當(dāng)resolve(成功)時,會調(diào)用onFulfilled函數(shù);
reject(失敗)時,會調(diào)用onRejected函數(shù)。
這也對應(yīng)了前面筆試題中,onFulfilled其實(shí)就是console.log(2),也就是說成功時會調(diào)用console.log(2),而失敗時,onRejected就是調(diào)用console.log(3)。
若只想處理異常情況的函數(shù),可promise.then(undefined, onRejected),當(dāng)然更好的選擇是用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的狀態(tài)Promise對象有三種狀態(tài)
pending 初始狀態(tài),既不是fulfilled也不是rejected
fulfilled 成功。此時調(diào)用onFulfilled
rejected 失敗。此時調(diào)用onRejected
Fulfilled和Rejected都可以表示為Settled。
由下圖可以了解,最初Promise為pending狀態(tài),在執(zhí)行后轉(zhuǎn)為settled狀態(tài),而settled狀態(tài)分為兩種:在成功后轉(zhuǎn)為fulfilled,執(zhí)行.then(onFulfilled)方法;在失敗后轉(zhuǎn)為reject,執(zhí)行.then(onRejecttion)或.catch(onRejecttion),進(jìn)行異步操作,再返回Promise對象,轉(zhuǎn)為pending狀態(tài)。
Promise.resolve
Promise.resolve(value)可認(rèn)為是new Promise()方法的快捷方式
Promise.value(value); //等同于以下代碼 new Promise(function(resolve){ resolve(value); });
此時這個promise對象會進(jìn)入fulfilled狀態(tài)。而resolve(value)中的value會傳遞給后面then中指定的onFulfilled函數(shù)。
Promise.resolve(value)返回值也是一個promise對象,所以可以進(jìn)行鏈?zhǔn)秸{(diào)用.
Promise.reject
Promise.reject(error)與上述靜態(tài)方法類似,也是new Promise()方法的快捷方式
Promise.reject(new Error("出錯了")); //等同于以下代碼 new Promise(function(resolve, reject){ reject(new Error("出錯了")); });
這段代碼則是調(diào)用該promise對象通過then指定的onRejected函數(shù),并將錯誤對象(Error)傳遞給onRejected函數(shù)。
筆試題解答話不多說,貼圖就是。
可以知道,當(dāng)promise調(diào)用了reject(true)方法,則傳遞true這個參數(shù)給"then"指定的onRejected函數(shù),即題目中的function(){console.log(3);}。但由于.then中指定的方法調(diào)用是異步執(zhí)行的,所以會先執(zhí)行console.log(4);
本篇文章僅是簡單介紹promise。欲了解更多內(nèi)容,可查看以下資料。謝謝~
資料來源:
Promise- Javascipt | MDN
JavaScript Promise迷你書(中文版)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/90867.html
摘要:如果你要問他和誰當(dāng)進(jìn)去的快,要從下面兩個方面考慮結(jié)束時。至于什么,查了很多的資料,了解到一個瀏覽器環(huán)境只能有一個事件循環(huán),而一個事件循環(huán)可以有多個任務(wù)隊(duì)列。 ====據(jù)說這是今日頭條去年的一道筆試題,主要考察的是setTimeout async promise執(zhí)行順序 ~先雙手奉上這道題目~ async function async1() { consol...
摘要:前兩天做了一份筆試題按照執(zhí)行順序列出下面代碼的打印內(nèi)容可能有些小朋友會被里面那個立即執(zhí)行函數(shù)嚇傻。和將指向改變至,也就是了。 前兩天做了一份筆試題:按照執(zhí)行順序列出下面代碼的打印內(nèi)容 var name = The Window; var object = { name : The Object, getNameFunc : function(){ (()...
摘要:注意點(diǎn)這個代碼是嚴(yán)格依賴環(huán)境的,例如中和是連續(xù)的,在編譯器中,和之間有一個空間。注意點(diǎn)當(dāng)把與交換之后,程序?qū)⒉粫霈F(xiàn)死循環(huán),但是程序的越界訪問報錯是少不了的。注意點(diǎn)這種優(yōu)化是無差別的,即無論你的代碼是否越界,都會進(jìn)行這樣的優(yōu)化。 目錄 聲明 原題 題目詳細(xì)解析 運(yùn)行結(jié)果: 題目...
摘要:前言接上篇前端筆試題面試題記錄上。默認(rèn)值,不脫離文檔流,,,,等屬性不生效。。不脫離文檔流,依據(jù)自身位置進(jìn)行偏離,當(dāng)子元素設(shè)置,將依據(jù)它進(jìn)行偏離。。 前言 接上篇前端筆試題面試題記錄(上)。趁清明小長假,把上篇剩下的部分也寫一下,因?yàn)樽罱容^忙這篇已經(jīng)拖了很久了?,F(xiàn)在剛剛開始銀四了,應(yīng)該還是有些小伙伴在找工作,時間還不算太晚,希望本篇可以幫到這些小伙伴。 個人博客了解一下:obkoro...
摘要:前言接上篇前端筆試題面試題記錄上。默認(rèn)值,不脫離文檔流,,,,等屬性不生效。。不脫離文檔流,依據(jù)自身位置進(jìn)行偏離,當(dāng)子元素設(shè)置,將依據(jù)它進(jìn)行偏離。。 前言 接上篇前端筆試題面試題記錄(上)。趁清明小長假,把上篇剩下的部分也寫一下,因?yàn)樽罱容^忙這篇已經(jīng)拖了很久了?,F(xiàn)在剛剛開始銀四了,應(yīng)該還是有些小伙伴在找工作,時間還不算太晚,希望本篇可以幫到這些小伙伴。 個人博客了解一下:obkoro...
閱讀 1336·2021-09-27 13:56
閱讀 2370·2019-08-26 10:35
閱讀 3534·2019-08-23 15:53
閱讀 1881·2019-08-23 14:42
閱讀 1262·2019-08-23 14:33
閱讀 3595·2019-08-23 12:36
閱讀 2003·2019-08-22 18:46
閱讀 1027·2019-08-22 14:06