国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

閱讀Promise A+規范

MrZONT / 2384人閱讀

摘要:多個注入的和回調函數的調用順序取決于調用方法的順序。是不是覺得很少使用對象方法處理方式其實我們一直在使用,中函數的回調函數參數的處理方式就是遵照規則。

本文主要是PromiseA+規范的翻譯加上個人的理解。

1 什么是Promise
A promise represents the eventual result of an asynchronous operation

表示異步操作的最終結果。
可以先看看這個是時候使用promise了了解下背景。

2 術語

promise: 含有名為then方法的對象或者函數,并且該then方法的行為遵從promises A+標準

thenable: 含有名為then方法的對象或者函數

value: 合法的JavaScript 值(包含undefined)

exception: 通過throw語句拋出的值

reason: 表示promise被拒絕的說明值,本質上是個value.

promise對象一定是thenable對象,但是thenable對象不一定是promise對象。
3 要求 3.1 Promise對象狀態

一個Promise有3種狀態:pending, fulfilled, rejected。并且任意時刻都只能處于一種狀態。

處于pending的Promise
1.1 可以轉成fulfilled或者rejected狀態。

處于fulfilled的Promise
2.1 不能轉成其他狀態
2.2 必須具有一個value,并且該value是固定不變的

處于rejected的Promise
3.1 不能轉成其他狀態
3.2 必須具有一個reason,并且該reason是固定不變的

fullfilled和rejected狀態是promise的終態,處于終態的promise必須具有一個值,這就是promise的定義:表示一個異步操作的最終結果。
3.2 then方法

promise對象必須提供then方法用來訪問處于終態(fullfilled或者rejected)的promise所表示的值。then方法接收兩個參數:

promise.then(onFulfilled, onRejected)

onFulfilled和onRejected參數都是可選的,如果他們是非函數,則忽略參數

如果onFulfilled是個函數
2.1 Promise處于并且只有處于fulfilled狀態時,就調用該函數,并且Promise的value作為該函數的第一個參數
2.2 該函數最多只能被調用一次

如果onRejected是個函數
3.1 promise處于并且只有處于rejected狀態時,就調用該函數,并且Promise的reason作為該函數的第一個參數
3.2 該函數最多只能被調用一次

promise的最終結果只能是一個值,所以回調函數onFullFilled, onRejected也只有一個形參。但是規范并沒有這樣限定,“as its first argument.”只要求作為第一個參數

onFulfilled or onRejected 必須通過異步的方式調用

onFulfilled和onRejected函數必須作為函數調用,即沒有綁定this參數。

同一個的promise的then方法可以多次被調用。
6.1 多個注入的onFulfilled和onRejected回調函數的調用順序取決于調用then方法的順序。

then方法必須返回一個promise

promise2 = promise1.then(onFulfilled, onRejected);
7.1 如果onFulfilled或者onRejected返回一個值x, 執行Promise解決流程 [[Resolve]](promise2, x)
7.2 如果onFulfilled或者onRejected拋出一個異常e, promise2必須被拒絕,并且把e作為其reason。
7.3 如果onFulfilled不是一個函數并且Promise1已經處以fulfilled,則Promise2也必須轉成fulfilled,并且把promise1的Value作為其Value
7.4 如果onRejected不是一個函數并且Promise1已經處以rejected,則Promise2也必須轉成rejected,并且把promise1的reason作為其reason

promise2的終態跟promise1沒有直接關系的,只跟onReject,onFullFilled回調函數有關

then方法構建了Promise對象鏈,重點也是難點就是Promise鏈中相鄰節點的前后影響

3.3 Promise 解決流程(Promise Resolution Procedure

Promise解決過程是一個抽象的操作,輸入參數是一個promise和一個value。可以表示為:[[Resolve]](promise, x),如果x是個thenable(包含promise對象), 則嘗試讓promise采用x的狀態,否則把promise轉成fulfilled并且把x作物其Value。
這種方式處理是為了thenables和promise可以互操作(注意thenable和Promise的區別)。thenable的then方法規則不一定符合Promise A+規范,這樣我們可以自定義了then方法的行為了。

Promose解決流程規范主要定義Promise對象鏈中兩個相鄰的promise對象間的關系(由then方法構建的promise鏈),可以表示為promise2 = promise1.then(onFulfilled, onRejected);。但需要注意的是后面的promise2對象終態跟前面一個promise1沒有直接關系的,只跟onReject,onFullFilled回調函數有直接關系:

是否是函數

執行是否拋異常

函數返回值

只有當promise1處于fullfilled且onFulfilled不是函數或者promise1處于rejected且onRejected不是函數時promise2的狀態才取決于promise1的狀態。

3.4 [[Resolve]](promise, x)的具體處理步驟

如果promise 和x相等,則拒絕promise,并且制定TypeError作為promie的reason。

promise對象不能處理自己的狀態。

如果x是個Promise,則采用其狀態(即promise的狀態要跟x一致):
2.1 如果x處于pending,則promise也要處于pending,直到x轉成fulfilled或者rejected.
2.2 如果x處于fulfilled, 則promise轉成fulfilled, 并且把x的Value作為promise的value.
2.3 如果x處于rejected, 則promise轉成rejected, 并且把x的reason作為promise的reason.

覆蓋x是個對象或者函數:
3.1 var then = x.then
3.2 如果訪問x.then導致了異常e,則把promise轉成rejected,并且reasion是e.
3.3 如果then是個函數,則執行then.call(x, resolvePromise, rejectedPromise)

3.3.1 如果調用resolvePromise(y), 則執行[[Resolve]](promise, y)
3.3.2 如果調用rejectedPromise(r), 把promise轉成rejected, 并且reason是r
3.3.3 如果rejectedPromise, resolvePromise同時或者多次調用,則只有第一個調用有效,其他調用被忽略
3.3.4 如果調用then中發生異常e
1) 如果已經調用了resolvePromise或者rejectedPromise,則忽略該異常
2)其他則把promise轉成rejected, 并且其reason是e

3.4 如果then不是一個函數(即不是一個thenable),則把promise轉成fulfilled,并且value是x(不是then)

其他,則把promise轉成fulfilled,并且value是x

注意:

Promise解決過程中對thenable對象和promise對象的處理方式不同的,thenable對象是遞歸方式處理的(當心死循環)。

是不是覺得很少使用thenable對象then方法處理方式?!其實我們一直在使用,ES6中Promise函數的回調函數參數的處理方式就是遵照3.3規則。

參考

Promises/A+

lie promise源碼閱讀

A small, performant promise library implementation

ES6 Promise

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/93558.html

相關文章

  • ES6-7

    摘要:的翻譯文檔由的維護很多人說,阮老師已經有一本關于的書了入門,覺得看看這本書就足夠了。前端的異步解決方案之和異步編程模式在前端開發過程中,顯得越來越重要。為了讓編程更美好,我們就需要引入來降低異步編程的復雜性。 JavaScript Promise 迷你書(中文版) 超詳細介紹promise的gitbook,看完再不會promise...... 本書的目的是以目前還在制定中的ECMASc...

    mudiyouyou 評論0 收藏0
  • JavaScript 異步

    摘要:從最開始的到封裝后的都在試圖解決異步編程過程中的問題。為了讓編程更美好,我們就需要引入來降低異步編程的復雜性。寫一個符合規范并可配合使用的寫一個符合規范并可配合使用的理解的工作原理采用回調函數來處理異步編程。 JavaScript怎么使用循環代替(異步)遞歸 問題描述 在開發過程中,遇到一個需求:在系統初始化時通過http獲取一個第三方服務器端的列表,第三方服務器提供了一個接口,可通過...

    tuniutech 評論0 收藏0
  • 小而美的Promise庫——promiz源碼淺析

    摘要:因此,當作為參數的執行任意結果的回調函數時,就會將參數傳遞給外層的,執行對應的回調函數。 背景 在上一篇博客[[譯]前端基礎知識儲備——Promise/A+規范](https://segmentfault.com/a/11...,我們介紹了Promise/A+規范的具體條目。在本文中,我們來選擇了promiz,讓大家來看下一個具體的Promise庫的內部代碼是如何運作的。 promiz...

    figofuture 評論0 收藏0
  • 實現 JavaScript 異步方法 Promise.all

    摘要:本次的任務假如。。。。。引擎發生了重大故障,方法變成了,為了拯救世界,需要開發一個模塊來解決此問題。實現首先要知道是什么是對異步編程的一種抽象。數組中任何一個為的話,則整個調用會立即終止,并返回一個的新的對象。 本次的任務 假如。。。。。 JavaScript v8 引擎發生了重大故障,Promise.all 方法變成了 undefined ,為了拯救 JavaScript 世界,需要...

    mushang 評論0 收藏0
  • 從0開始構建自己的前端知識體系-JS-跟著規范Promise

    摘要:本文僅限瀏覽器環境測試,環境可能會不一致狀態一個實例只能處于三種狀態中的一種。每次創建的實例都會處于狀態,并且只能由變為或狀態。可以認為在實現里與中的都為解決程序。 前言 Promise作為ES6極為重要的一個特性,將我們從無限的回調地獄中解脫出來,變為鏈式的編寫回調,大大提高的代碼的可讀性。 使用Promise是極為簡單的,但只停留在會使用階段還是會讓我們不知不覺踩到一些坑的。本文會...

    kelvinlee 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<