亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

一道筆試題引發(fā)的Promise筆記

_Suqin / 1120人閱讀

摘要:對(duì)象是一個(gè)返回值的代理,這個(gè)返回值在對(duì)象創(chuàng)建時(shí)未必已知。這使得異步方法可以像同步方法那樣返回值異步方法會(huì)返回一個(gè)包含了原返回值的對(duì)象來(lái)替代原返回值。

前言

近來(lái)參加校招筆試,發(fā)現(xiàn)有好幾道關(guān)于Promise的題目。然而我都沒有了解過(guò)。所以,這篇文章以網(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);

請(qǐng)問輸出結(jié)果是什么?在揭曉答案之前,我們還是先來(lái)了解一下Promise吧。

Promise是什么

Promise 對(duì)象用于異步(asynchronous)計(jì)算.。一個(gè)Promise對(duì)象代表著一個(gè)還未完成,但預(yù)期將來(lái)會(huì)完成的操作。
Promise 對(duì)象是一個(gè)返回值的代理,這個(gè)返回值在promise對(duì)象創(chuàng)建時(shí)未必已知。它允許你為異步操作的成功或失敗指定處理方法。 這使得異步方法可以像同步方法那樣返回值:異步方法會(huì)返回一個(gè)包含了原返回值的 promise 對(duì)象來(lái)替代原返回值。

Promise的API Constructor

使用new來(lái)調(diào)用Promise的構(gòu)造器進(jìn)行實(shí)例化

var promise = new Promise(function(resolve, reject){
    //異步處理
    //處理結(jié)束后,調(diào)用resolve或reject
});
Instance Method

對(duì)通過(guò)new生成的promise對(duì)象為了設(shè)置其在resolve(成功)/reject(失敗)時(shí)調(diào)用的回調(diào)函數(shù)可以使用promise.then()實(shí)例方法

promise.then(onFulfilled, onRejected);
//以防誤解,上述的即為以下這種形式
promise.then(function(){...}, function(){...});

當(dāng)resolve(成功)時(shí),會(huì)調(diào)用onFulfilled函數(shù);
reject(失敗)時(shí),會(huì)調(diào)用onRejected函數(shù)。
這也對(duì)應(yīng)了前面筆試題中,onFulfilled其實(shí)就是console.log(2),也就是說(shuō)成功時(shí)會(huì)調(diào)用console.log(2),而失敗時(shí),onRejected就是調(diào)用console.log(3)

若只想處理異常情況的函數(shù),可promise.then(undefined, onRejected),當(dāng)然更好的選擇是用promise.catch()來(lái)處理。二者效果相同。

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對(duì)象有三種狀態(tài)

pending 初始狀態(tài),既不是fulfilled也不是rejected

fulfilled 成功。此時(shí)調(diào)用onFulfilled

rejected 失敗。此時(shí)調(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對(duì)象,轉(zhuǎn)為pending狀態(tài)。

Promise.resolve & Promise.reject

Promise.resolve

Promise.resolve(value)可認(rèn)為是new Promise()方法的快捷方式

Promise.value(value);

//等同于以下代碼

new Promise(function(resolve){
    resolve(value);
});

此時(shí)這個(gè)promise對(duì)象會(huì)進(jìn)入fulfilled狀態(tài)。而resolve(value)中的value會(huì)傳遞給后面then中指定的onFulfilled函數(shù)。

Promise.resolve(value)返回值也是一個(gè)promise對(duì)象,所以可以進(jìn)行鏈?zhǔn)秸{(diào)用.

Promise.reject

Promise.reject(error)與上述靜態(tài)方法類似,也是new Promise()方法的快捷方式

Promise.reject(new Error("出錯(cuò)了"));
//等同于以下代碼
new Promise(function(resolve, reject){
    reject(new Error("出錯(cuò)了"));
});

這段代碼則是調(diào)用該promise對(duì)象通過(guò)then指定的onRejected函數(shù),并將錯(cuò)誤對(duì)象(Error)傳遞給onRejected函數(shù)。

筆試題解答

話不多說(shuō),貼圖就是。

可以知道,當(dāng)promise調(diào)用了reject(true)方法,則傳遞true這個(gè)參數(shù)給"then"指定的onRejected函數(shù),即題目中的function(){console.log(3);}。但由于.then中指定的方法調(diào)用是異步執(zhí)行的,所以會(huì)先執(zhí)行console.log(4);

本篇文章僅是簡(jiǎn)單介紹promise。欲了解更多內(nèi)容,可查看以下資料。謝謝~

資料來(lái)源:

Promise- Javascipt | MDN

JavaScript Promise迷你書(中文版)

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/90867.html

相關(guān)文章

  • 一道setTimeout async promise執(zhí)行順序試題引發(fā)思考

    摘要:如果你要問他和誰(shuí)當(dāng)進(jìn)去的快,要從下面兩個(gè)方面考慮結(jié)束時(shí)。至于什么,查了很多的資料,了解到一個(gè)瀏覽器環(huán)境只能有一個(gè)事件循環(huán),而一個(gè)事件循環(huán)可以有多個(gè)任務(wù)隊(duì)列。 ====據(jù)說(shuō)這是今日頭條去年的一道筆試題,主要考察的是setTimeout async promise執(zhí)行順序 ~先雙手奉上這道題目~ async function async1() { consol...

    soasme 評(píng)論0 收藏0
  • 一道試題引發(fā)思考

    摘要:前兩天做了一份筆試題按照?qǐng)?zhí)行順序列出下面代碼的打印內(nèi)容可能有些小朋友會(huì)被里面那個(gè)立即執(zhí)行函數(shù)嚇傻。和將指向改變至,也就是了。 前兩天做了一份筆試題:按照?qǐng)?zhí)行順序列出下面代碼的打印內(nèi)容 var name = The Window; var object = { name : The Object, getNameFunc : function(){ (()...

    soasme 評(píng)論0 收藏0
  • 一道2016年nice校招試題引發(fā)思考

    摘要:注意點(diǎn)這個(gè)代碼是嚴(yán)格依賴環(huán)境的,例如中和是連續(xù)的,在編譯器中,和之間有一個(gè)空間。注意點(diǎn)當(dāng)把與交換之后,程序?qū)⒉粫?huì)出現(xiàn)死循環(huán),但是程序的越界訪問報(bào)錯(cuò)是少不了的。注意點(diǎn)這種優(yōu)化是無(wú)差別的,即無(wú)論你的代碼是否越界,都會(huì)進(jìn)行這樣的優(yōu)化。 目錄 聲明 原題 題目詳細(xì)解析 運(yùn)行結(jié)果: 題目...

    shixinzhang 評(píng)論0 收藏0
  • 前端試題試題記錄(下)

    摘要:前言接上篇前端筆試題面試題記錄上。默認(rèn)值,不脫離文檔流,,,,等屬性不生效。。不脫離文檔流,依據(jù)自身位置進(jìn)行偏離,當(dāng)子元素設(shè)置,將依據(jù)它進(jìn)行偏離。。 前言 接上篇前端筆試題面試題記錄(上)。趁清明小長(zhǎng)假,把上篇剩下的部分也寫一下,因?yàn)樽罱容^忙這篇已經(jīng)拖了很久了?,F(xiàn)在剛剛開始銀四了,應(yīng)該還是有些小伙伴在找工作,時(shí)間還不算太晚,希望本篇可以幫到這些小伙伴。 個(gè)人博客了解一下:obkoro...

    Lin_YT 評(píng)論0 收藏0
  • 前端試題試題記錄(下)

    摘要:前言接上篇前端筆試題面試題記錄上。默認(rèn)值,不脫離文檔流,,,,等屬性不生效。。不脫離文檔流,依據(jù)自身位置進(jìn)行偏離,當(dāng)子元素設(shè)置,將依據(jù)它進(jìn)行偏離。。 前言 接上篇前端筆試題面試題記錄(上)。趁清明小長(zhǎng)假,把上篇剩下的部分也寫一下,因?yàn)樽罱容^忙這篇已經(jīng)拖了很久了?,F(xiàn)在剛剛開始銀四了,應(yīng)該還是有些小伙伴在找工作,時(shí)間還不算太晚,希望本篇可以幫到這些小伙伴。 個(gè)人博客了解一下:obkoro...

    suemi 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<