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