摘要:對于異步的解決方案是新增的內(nèi)置對象,通常使用構(gòu)造函數(shù)創(chuàng)建,實例,解決異步問題。構(gòu)造函數(shù)必須接收一個函數(shù)作為參數(shù),我將其稱為函數(shù),函數(shù)也可以接收兩個參數(shù),和,它們是兩個函數(shù),由運行環(huán)境提供,無需自己部署。如何理解規(guī)范中的這三個狀態(tài)及其規(guī)則。
對于異步的解決方案 Promise
Promise是ES6新增的內(nèi)置對象,通常使用Promise構(gòu)造函數(shù)創(chuàng)建,Promise實例,解決異步問題。
1.Promise構(gòu)造函數(shù)必須接收一個函數(shù)作為參數(shù),我將其稱為executor函數(shù),executor函數(shù)也可以接收兩個參數(shù),resolve和reject,它們是兩個函數(shù),由ECMAScript運行環(huán)境提供,無需自己部署。
//執(zhí)行Promise函數(shù),它返回一個promise實例對象 let promise=new Promise ((resolve,reject)=>{ console.log(1); });
當(dāng)我們使用new創(chuàng)建一個構(gòu)建一個Promise實例后,Promise實例內(nèi)部的兩個屬性需要理解。
讓我們輸出上方的promise實例
[[PromiseStatus]]: "pending" [[PromiseValue]]: undefined
[[PromiseStatus]]:保存當(dāng)前promise實例的狀態(tài),可能值pending,resolved,rejected
[[PromiseValue]]:在promise未完成狀態(tài)時,其值為undefinde,當(dāng)promise完成后,其值為異步數(shù)據(jù),或者錯誤信息。當(dāng)執(zhí)行了resolve(),[[PromiseValue]]的值就是resolve()傳入 的表達(dá)式的值,通常就是是我們需要的值。當(dāng)我們使用了reject(),這個值為reject()的傳入值,通常這個值為錯誤提示
2.對于resolve和reject,它們的作用是判斷對象的狀態(tài)。并且它們調(diào)用時可以接收一個參數(shù)。
let promise=new Promise ((resolve,reject)=>{ console.log(1); resolve("成功"); });
當(dāng)調(diào)用了resolve或reject ,promise實例的[[PromiseStatus]]將發(fā)生改變。
現(xiàn)在,讓我們更加詳細(xì)的去了解Promise promise狀態(tài)一個Promise對象的當(dāng)前狀態(tài)必須為一下三種狀態(tài)的一種:Pending(等待狀態(tài)),Fulfilled(執(zhí)行狀態(tài)),Rejected(拒絕狀態(tài))
Pending:處于Pending狀態(tài)時,promise可以滿足以下條件
? 可以由Pending轉(zhuǎn)為Fulfilled或Rejected ,
Fulfilled:處于Fulfilled狀態(tài)時,promise滿足以下條件
? 1.不可再變?yōu)槠渌鼱顟B(tài)。
? 2.必須有一個不可被改變的值。
Rejected:
? 1.不可再變?yōu)槠渌鼱顟B(tài)。
? 2.必須有一個不可被改變的值。
如何理解Promise A + 規(guī)范中的這三個狀態(tài)及其規(guī)則。
Promise對象的兩個內(nèi)部屬性可以很好幫我們?nèi)ソ忉尷斫狻?/p>
[[PromiseStatus]] ,[[PromiseValue]]
現(xiàn)在,進(jìn)行Promise第一步,新建一個Promise對象,對象兩個內(nèi)部屬性被初始化
[[PromiseStatus]] :Pending
[[PromiseValue]]:undefined
此時是規(guī)范中的第一種狀態(tài),OK,根據(jù)規(guī)范的Pending狀態(tài)的條件,我們可以去改變其狀態(tài)。
executor函數(shù)在Promise對象創(chuàng)建后立即執(zhí)行。
倘若我們在executor函數(shù)執(zhí)行了resolve()函數(shù),并且,將一個表達(dá)式(Expression)作為其參數(shù)傳入。此時內(nèi)部屬性值的變化
[[PromiseStatus]]:resolved
[[PromiseValue]]:<表達(dá)式的值>
此時,Promise對象的狀態(tài)有Pending變?yōu)镕ulfilled.通俗點說,就是由等待變?yōu)?b>成功。根據(jù)Promise A+ 的Fulfilled狀態(tài)的規(guī)范條件,此時,無論接下來在遇到什么情況,都不會去改變它的狀態(tài)!,并且Promise對象將會有一個值,Yes,這個值就是我們需要的值,準(zhǔn)確的說,它就是那個傳入的表達(dá)式的值,并且這個值通過resolve()函數(shù)存入了[[PromiseValue]]屬性中。我們無法直接去使用它,而是通過then()去獲取
讓我們來看個例子
let p1 = new Promise((res,rej)=>{ res((() => { return "成功了"; })()) }) console.log(p1); //輸出 [[PromiseStatus]]: "resolved" [[PromiseValue]]: "成功了"
倘若我們在executor函數(shù)執(zhí)行了reject()函數(shù),并且,將一個表達(dá)式(Expression)作為其參數(shù)傳入。此時內(nèi)部屬性值的變化
let p2 = new Promise((res,rej)=>{ rej((() => { return "失敗了"; })()) }) console.log(p2); // promise對象的兩個屬性 [[PromiseStatus]]: "rejected" [[PromiseValue]]: "失敗了"
此時,Promise對象的狀態(tài)有Pending變?yōu)镕ulfilled,由等待變?yōu)?b>失敗,根據(jù)Promise A+ 的Fulfilled狀態(tài)的規(guī)范條件,此時,無論接下來在遇到什么情況,都不會去改變它的狀態(tài)!并且Promise對象將會有一個值,同樣也是那個傳入的表達(dá)式的值,不過我們將這個值稱為拒因或失敗原因。
注意:resolve或reject并不會終結(jié) Promise 的executor函數(shù)的執(zhí)行
我們已經(jīng)在executor函數(shù)中執(zhí)行了resolve或reject函數(shù),狀態(tài)發(fā)生改變,內(nèi)部屬性值也發(fā)生了改變
現(xiàn)在,該啟動then()方法和 catch()方法了。 then()它有兩個函數(shù)作為參數(shù),通常,我們只使用第一個函數(shù)來獲取[[PromiseStatus]]的值為"resolved"的對象的[[PromiseValue]]值,回調(diào)函數(shù)接收一個參數(shù),此參數(shù)就是[[PromiseValue]]值
let p1 = new Promise((res,rej)=>{ res((() => { return "成功了"; })()) }).then(data=>{ console.log(data) })
注意 : then() 方法產(chǎn)生一個微任務(wù),其回調(diào)將會被置入上一個宏任務(wù)隊列后。
cathc()當(dāng)[[PromiseStatus]]為reject時,調(diào)用此方法。
它接收一個函數(shù)作為參數(shù),此函數(shù)接收一個參數(shù),該參數(shù)就是拒因
let p2 = new Promise((res,rej)=>{ rej((() => { return "失敗了"; })()) }).then(data=>{ console.log(data) }).catch(error=>console.log(error))
現(xiàn)在大致了解了Promise是怎么回事了 Good!
還有注意 :無論如何,在使用Promise對象時,加上catch(),否則你很可能不知道錯誤到底是出在哪里
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/104251.html
摘要:記錄下我遇到的面試題,都有大佬分享過,附上各個大佬的文章,總結(jié)出其中的主要思想即可。推薦黑金團(tuán)隊的文章前端緩存最佳實踐推薦名揚的文章淺解強(qiáng)緩存和協(xié)商緩存狀態(tài)碼重點是等,要給面試官介紹清楚。前言 在這互聯(lián)網(wǎng)的寒冬臘月時期,雖說過了金三銀四,但依舊在招人不斷。更偏向于招聘高級開發(fā)工程師。本人在這期間求職,去了幾家創(chuàng)業(yè),小廠,大廠廝殺了一番,也得到了自己滿意的offer。 整理一下自己還記得的面試...
摘要:的幾個擴(kuò)展總結(jié)描述和相反,當(dāng)所有的被拒絕之后,方法執(zhí)行完成的決議,如果存在一個執(zhí)行完成的決議,方法則執(zhí)行拒絕里邊的所有實例反過來就好了執(zhí)行到此執(zhí)行到此描述忽略被拒絕的,只需要有一個完成的,方法就執(zhí)行完成操作,如果全部的都被拒絕,方法執(zhí)行拒絕 Promise的幾個擴(kuò)展API總結(jié) 1. Promise.none 描述: 和 Promise.all 相反,當(dāng)所有的promise被拒絕之后,n...
摘要:構(gòu)造函數(shù)的實現(xiàn)我們在使用的時候其實是使用關(guān)鍵字創(chuàng)建了一個的實例,其實是一個類,即構(gòu)造函數(shù),下面來實現(xiàn)構(gòu)造函數(shù)。 showImg(https://segmentfault.com/img/remote/1460000018998456); 閱讀原文 概述 Promise 是 js 異步編程的一種解決方案,避免了 回調(diào)地獄 給編程帶來的麻煩,在 ES6 中成為了標(biāo)準(zhǔn),這篇文章重點不是敘...
摘要:使用對象的好處在于可以將異步操作以同步操作的流程表達(dá)出來,避免了層層嵌套的回調(diào)函數(shù)。對象異步操作拋出錯誤,狀態(tài)就會變?yōu)椋蜁{(diào)用方法指定的回調(diào)函數(shù)處理這個錯誤。 Promise 含義 Promise 是異步編程的一種解決方案,比傳統(tǒng)的解決方案——回調(diào)函數(shù)和事件——更合理和更強(qiáng)大。它由社區(qū)最早提出和實現(xiàn),ES6 將其寫進(jìn)了語言標(biāo)準(zhǔn),統(tǒng)一了用法,原生提供了 Promise 對象。 所謂 P...
摘要:對于的來說基元函數(shù)包括組合函數(shù)的類型簽名返回情況完成如果傳入的可迭代對象為空,會同步地返回一個已完成狀態(tài)的。相反,如果是在指定的時間之后完成,剛返回結(jié)果就是一個拒絕狀態(tài)的從而觸發(fā)方法指定的回調(diào)函數(shù)。在行中,對每個小任務(wù)得到的結(jié)果進(jìn)行匯總。 為了保證的可讀性,本文采用意譯而非直譯。 想閱讀更多優(yōu)質(zhì)文章請猛戳GitHub博客,一年百來篇優(yōu)質(zhì)文章等著你! 從ES6 開始,我們大都使用的是 P...
閱讀 1146·2021-11-16 11:44
閱讀 1416·2019-08-30 13:12
閱讀 2469·2019-08-29 16:05
閱讀 3132·2019-08-28 18:29
閱讀 952·2019-08-26 13:41
閱讀 3278·2019-08-26 13:34
閱讀 2655·2019-08-26 10:35
閱讀 984·2019-08-26 10:28