摘要:多個(gè)注入的和回調(diào)函數(shù)的調(diào)用順序取決于調(diào)用方法的順序。是不是覺(jué)得很少使用對(duì)象方法處理方式其實(shí)我們一直在使用,中函數(shù)的回調(diào)函數(shù)參數(shù)的處理方式就是遵照規(guī)則。
本文主要是PromiseA+規(guī)范的翻譯加上個(gè)人的理解。
1 什么是PromiseA promise represents the eventual result of an asynchronous operation
表示異步操作的最終結(jié)果。
可以先看看這個(gè)是時(shí)候使用promise了了解下背景。
promise: 含有名為then方法的對(duì)象或者函數(shù),并且該then方法的行為遵從promises A+標(biāo)準(zhǔn)
thenable: 含有名為then方法的對(duì)象或者函數(shù)
value: 合法的JavaScript 值(包含undefined)
exception: 通過(guò)throw語(yǔ)句拋出的值
reason: 表示promise被拒絕的說(shuō)明值,本質(zhì)上是個(gè)value.
promise對(duì)象一定是thenable對(duì)象,但是thenable對(duì)象不一定是promise對(duì)象。3 要求 3.1 Promise對(duì)象狀態(tài)
一個(gè)Promise有3種狀態(tài):pending, fulfilled, rejected。并且任意時(shí)刻都只能處于一種狀態(tài)。
處于pending的Promise
1.1 可以轉(zhuǎn)成fulfilled或者rejected狀態(tài)。
處于fulfilled的Promise
2.1 不能轉(zhuǎn)成其他狀態(tài)
2.2 必須具有一個(gè)value,并且該value是固定不變的
處于rejected的Promise
3.1 不能轉(zhuǎn)成其他狀態(tài)
3.2 必須具有一個(gè)reason,并且該reason是固定不變的
fullfilled和rejected狀態(tài)是promise的終態(tài),處于終態(tài)的promise必須具有一個(gè)值,這就是promise的定義:表示一個(gè)異步操作的最終結(jié)果。3.2 then方法
promise對(duì)象必須提供then方法用來(lái)訪問(wèn)處于終態(tài)(fullfilled或者rejected)的promise所表示的值。then方法接收兩個(gè)參數(shù):
promise.then(onFulfilled, onRejected)
onFulfilled和onRejected參數(shù)都是可選的,如果他們是非函數(shù),則忽略參數(shù)
如果onFulfilled是個(gè)函數(shù)
2.1 Promise處于并且只有處于fulfilled狀態(tài)時(shí),就調(diào)用該函數(shù),并且Promise的value作為該函數(shù)的第一個(gè)參數(shù)
2.2 該函數(shù)最多只能被調(diào)用一次
如果onRejected是個(gè)函數(shù)
3.1 promise處于并且只有處于rejected狀態(tài)時(shí),就調(diào)用該函數(shù),并且Promise的reason作為該函數(shù)的第一個(gè)參數(shù)
3.2 該函數(shù)最多只能被調(diào)用一次
promise的最終結(jié)果只能是一個(gè)值,所以回調(diào)函數(shù)onFullFilled, onRejected也只有一個(gè)形參。但是規(guī)范并沒(méi)有這樣限定,“as its first argument.”只要求作為第一個(gè)參數(shù)
onFulfilled or onRejected 必須通過(guò)異步的方式調(diào)用
onFulfilled和onRejected函數(shù)必須作為函數(shù)調(diào)用,即沒(méi)有綁定this參數(shù)。
同一個(gè)的promise的then方法可以多次被調(diào)用。
6.1 多個(gè)注入的onFulfilled和onRejected回調(diào)函數(shù)的調(diào)用順序取決于調(diào)用then方法的順序。
then方法必須返回一個(gè)promise
promise2 = promise1.then(onFulfilled, onRejected);
7.1 如果onFulfilled或者onRejected返回一個(gè)值x, 執(zhí)行Promise解決流程 [[Resolve]](promise2, x) 7.2 如果onFulfilled或者onRejected拋出一個(gè)異常e, promise2必須被拒絕,并且把e作為其reason。 7.3 如果onFulfilled不是一個(gè)函數(shù)并且Promise1已經(jīng)處以fulfilled,則Promise2也必須轉(zhuǎn)成fulfilled,并且把promise1的Value作為其Value 7.4 如果onRejected不是一個(gè)函數(shù)并且Promise1已經(jīng)處以rejected,則Promise2也必須轉(zhuǎn)成rejected,并且把promise1的reason作為其reason
3.3 Promise 解決流程(Promise Resolution Procedurepromise2的終態(tài)跟promise1沒(méi)有直接關(guān)系的,只跟onReject,onFullFilled回調(diào)函數(shù)有關(guān)
then方法構(gòu)建了Promise對(duì)象鏈,重點(diǎn)也是難點(diǎn)就是Promise鏈中相鄰節(jié)點(diǎn)的前后影響
Promise解決過(guò)程是一個(gè)抽象的操作,輸入?yún)?shù)是一個(gè)promise和一個(gè)value??梢员硎緸椋篬[Resolve]](promise, x),如果x是個(gè)thenable(包含promise對(duì)象), 則嘗試讓promise采用x的狀態(tài),否則把promise轉(zhuǎn)成fulfilled并且把x作物其Value。
這種方式處理是為了thenables和promise可以互操作(注意thenable和Promise的區(qū)別)。thenable的then方法規(guī)則不一定符合Promise A+規(guī)范,這樣我們可以自定義了then方法的行為了。
Promose解決流程規(guī)范主要定義Promise對(duì)象鏈中兩個(gè)相鄰的promise對(duì)象間的關(guān)系(由then方法構(gòu)建的promise鏈),可以表示為promise2 = promise1.then(onFulfilled, onRejected);。但需要注意的是后面的promise2對(duì)象終態(tài)跟前面一個(gè)promise1沒(méi)有直接關(guān)系的,只跟onReject,onFullFilled回調(diào)函數(shù)有直接關(guān)系:
是否是函數(shù)
執(zhí)行是否拋異常
函數(shù)返回值
只有當(dāng)promise1處于fullfilled且onFulfilled不是函數(shù)或者promise1處于rejected且onRejected不是函數(shù)時(shí)promise2的狀態(tài)才取決于promise1的狀態(tài)。
3.4 [[Resolve]](promise, x)的具體處理步驟如果promise 和x相等,則拒絕promise,并且制定TypeError作為promie的reason。
promise對(duì)象不能處理自己的狀態(tài)。
如果x是個(gè)Promise,則采用其狀態(tài)(即promise的狀態(tài)要跟x一致):
2.1 如果x處于pending,則promise也要處于pending,直到x轉(zhuǎn)成fulfilled或者rejected.
2.2 如果x處于fulfilled, 則promise轉(zhuǎn)成fulfilled, 并且把x的Value作為promise的value.
2.3 如果x處于rejected, 則promise轉(zhuǎn)成rejected, 并且把x的reason作為promise的reason.
覆蓋x是個(gè)對(duì)象或者函數(shù):
3.1 var then = x.then
3.2 如果訪問(wèn)x.then導(dǎo)致了異常e,則把promise轉(zhuǎn)成rejected,并且reasion是e.
3.3 如果then是個(gè)函數(shù),則執(zhí)行then.call(x, resolvePromise, rejectedPromise)
3.3.1 如果調(diào)用resolvePromise(y), 則執(zhí)行[[Resolve]](promise, y) 3.3.2 如果調(diào)用rejectedPromise(r), 把promise轉(zhuǎn)成rejected, 并且reason是r 3.3.3 如果rejectedPromise, resolvePromise同時(shí)或者多次調(diào)用,則只有第一個(gè)調(diào)用有效,其他調(diào)用被忽略 3.3.4 如果調(diào)用then中發(fā)生異常e 1) 如果已經(jīng)調(diào)用了resolvePromise或者rejectedPromise,則忽略該異常 2)其他則把promise轉(zhuǎn)成rejected, 并且其reason是e
3.4 如果then不是一個(gè)函數(shù)(即不是一個(gè)thenable),則把promise轉(zhuǎn)成fulfilled,并且value是x(不是then)
其他,則把promise轉(zhuǎn)成fulfilled,并且value是x
參考注意:
Promise解決過(guò)程中對(duì)thenable對(duì)象和promise對(duì)象的處理方式不同的,thenable對(duì)象是遞歸方式處理的(當(dāng)心死循環(huán))。
是不是覺(jué)得很少使用thenable對(duì)象then方法處理方式?!其實(shí)我們一直在使用,ES6中Promise函數(shù)的回調(diào)函數(shù)參數(shù)的處理方式就是遵照3.3規(guī)則。
Promises/A+
lie promise源碼閱讀
A small, performant promise library implementation
ES6 Promise
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/93558.html
摘要:的翻譯文檔由的維護(hù)很多人說(shuō),阮老師已經(jīng)有一本關(guān)于的書(shū)了入門(mén),覺(jué)得看看這本書(shū)就足夠了。前端的異步解決方案之和異步編程模式在前端開(kāi)發(fā)過(guò)程中,顯得越來(lái)越重要。為了讓編程更美好,我們就需要引入來(lái)降低異步編程的復(fù)雜性。 JavaScript Promise 迷你書(shū)(中文版) 超詳細(xì)介紹promise的gitbook,看完再不會(huì)promise...... 本書(shū)的目的是以目前還在制定中的ECMASc...
摘要:從最開(kāi)始的到封裝后的都在試圖解決異步編程過(guò)程中的問(wèn)題。為了讓編程更美好,我們就需要引入來(lái)降低異步編程的復(fù)雜性。寫(xiě)一個(gè)符合規(guī)范并可配合使用的寫(xiě)一個(gè)符合規(guī)范并可配合使用的理解的工作原理采用回調(diào)函數(shù)來(lái)處理異步編程。 JavaScript怎么使用循環(huán)代替(異步)遞歸 問(wèn)題描述 在開(kāi)發(fā)過(guò)程中,遇到一個(gè)需求:在系統(tǒng)初始化時(shí)通過(guò)http獲取一個(gè)第三方服務(wù)器端的列表,第三方服務(wù)器提供了一個(gè)接口,可通過(guò)...
摘要:因此,當(dāng)作為參數(shù)的執(zhí)行任意結(jié)果的回調(diào)函數(shù)時(shí),就會(huì)將參數(shù)傳遞給外層的,執(zhí)行對(duì)應(yīng)的回調(diào)函數(shù)。 背景 在上一篇博客[[譯]前端基礎(chǔ)知識(shí)儲(chǔ)備——Promise/A+規(guī)范](https://segmentfault.com/a/11...,我們介紹了Promise/A+規(guī)范的具體條目。在本文中,我們來(lái)選擇了promiz,讓大家來(lái)看下一個(gè)具體的Promise庫(kù)的內(nèi)部代碼是如何運(yùn)作的。 promiz...
摘要:本次的任務(wù)假如。。。。。引擎發(fā)生了重大故障,方法變成了,為了拯救世界,需要開(kāi)發(fā)一個(gè)模塊來(lái)解決此問(wèn)題。實(shí)現(xiàn)首先要知道是什么是對(duì)異步編程的一種抽象。數(shù)組中任何一個(gè)為的話,則整個(gè)調(diào)用會(huì)立即終止,并返回一個(gè)的新的對(duì)象。 本次的任務(wù) 假如。。。。。 JavaScript v8 引擎發(fā)生了重大故障,Promise.all 方法變成了 undefined ,為了拯救 JavaScript 世界,需要...
摘要:本文僅限瀏覽器環(huán)境測(cè)試,環(huán)境可能會(huì)不一致?tīng)顟B(tài)一個(gè)實(shí)例只能處于三種狀態(tài)中的一種。每次創(chuàng)建的實(shí)例都會(huì)處于狀態(tài),并且只能由變?yōu)榛驙顟B(tài)??梢哉J(rèn)為在實(shí)現(xiàn)里與中的都為解決程序。 前言 Promise作為ES6極為重要的一個(gè)特性,將我們從無(wú)限的回調(diào)地獄中解脫出來(lái),變?yōu)殒準(zhǔn)降木帉?xiě)回調(diào),大大提高的代碼的可讀性。 使用Promise是極為簡(jiǎn)單的,但只停留在會(huì)使用階段還是會(huì)讓我們不知不覺(jué)踩到一些坑的。本文會(huì)...
閱讀 1768·2023-04-26 02:43
閱讀 3291·2021-11-11 16:54
閱讀 1433·2021-09-23 11:54
閱讀 1252·2021-09-23 11:22
閱讀 2442·2021-08-23 09:45
閱讀 916·2019-08-30 15:54
閱讀 3157·2019-08-30 15:53
閱讀 3251·2019-08-30 15:53