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

資訊專欄INFORMATION COLUMN

【譯】前端知識(shí)儲(chǔ)備——Promise/A+規(guī)范

Gemini / 2332人閱讀

摘要:在將來(lái)的其他規(guī)范中可能會(huì)涉及這些沒(méi)有提及的內(nèi)容。它禁止被觸發(fā)多次。如果到了狀態(tài),那么所有的回調(diào)函數(shù)都必須按照他們?cè)械捻樞蜻M(jìn)行調(diào)用執(zhí)行。

概述

自從準(zhǔn)備晉級(jí)之后,就拖更了很久了,既然晉級(jí)弄完了,那么也恢復(fù)更新了。

在面試別人的過(guò)程中,發(fā)現(xiàn)基本上沒(méi)有人對(duì)整個(gè)Promise完全了解,因此希望通過(guò)這篇文章來(lái)幫助大家了解下Promise的全貌。本文的主要內(nèi)容是Promise/A+規(guī)范的譯文,主要是能夠幫助大家了解下Promise的規(guī)范,以及解決在日常運(yùn)用中遇到的一些問(wèn)題。

原文地址為:https://promisesaplus.com/#po...

如果需要測(cè)試一個(gè)Promise庫(kù)是否符合Promise/A+規(guī)范,可以使用這個(gè):https://github.com/promises-a... 。

原文概覽

一個(gè)標(biāo)準(zhǔn)聲明、可操作的JavaScript Promise——出自開(kāi)發(fā)者,為了開(kāi)發(fā)者。

一個(gè)promise代表一個(gè)異步操作的最終結(jié)果。與promise交互的主要方法是通過(guò)它的then函數(shù)。這個(gè)函數(shù)注冊(cè)一個(gè)回調(diào)函數(shù)來(lái)接收promise最終的值(value)或者是沒(méi)有成功的原因(reason)。

這篇文檔詳細(xì)說(shuō)明了then方法的具體行為,它為所有的符合Promise/A+規(guī)范的實(shí)現(xiàn)提供了一個(gè)基礎(chǔ)的交互。像這樣,這個(gè)規(guī)范應(yīng)該設(shè)計(jì)的非常穩(wěn)定。盡管Promise/A+組織可能偶爾通過(guò)一些向后兼容的小修改來(lái)調(diào)整這個(gè)文檔來(lái)適應(yīng)新發(fā)現(xiàn)的場(chǎng)景,我們只會(huì)在經(jīng)歷過(guò)了小心的思考、討論和測(cè)試后增加大的、不向后兼容的修改。

從歷史上來(lái)看,Promise/A+闡述了更早的Promise/A的行為規(guī)范,并且在其基礎(chǔ)上進(jìn)行了擴(kuò)展,覆蓋了一些實(shí)際行為和之前遺漏的問(wèn)題。

最終,核心的Promise/A+文檔不關(guān)心如何去創(chuàng)建、完成(resolve)或者拒絕(reject)一個(gè)Promise,而是聚焦在提供一個(gè)可交互的then函數(shù)。在將來(lái)的其他規(guī)范中可能會(huì)涉及這些沒(méi)有提及的內(nèi)容。

1. 術(shù)語(yǔ)

1.1. "promise"是一個(gè)對(duì)象或者函數(shù),它擁有一個(gè)符合文檔中描述行為的then方法。

1.2. "thenable"是一個(gè)有then方法的對(duì)象或者函數(shù)。

1.3. "value"是一個(gè)合法的JavaScript值(包括undefined, 一個(gè)thenable或者一個(gè)promise)。

1.4. "exception"是一個(gè)使用在throw語(yǔ)句中的拋出來(lái)的值。

1.5. "reason"是一個(gè)用來(lái)表示promise拒絕的原因的值。

2. 要求 2.1 promise狀態(tài)

一個(gè)promise必須處于一下三種狀態(tài):pending、fulfilled或者rejected。

2.1.1. 當(dāng)處于pending狀態(tài)時(shí),promise:

2.1.1.1. 可能會(huì)轉(zhuǎn)換成任何其他的狀態(tài)。

2.1.2. 當(dāng)處于fulfilled狀態(tài)時(shí),promise:

2.1.2.1. 禁止轉(zhuǎn)換成其他狀態(tài)。

2.1.2.2. 必須有一個(gè)無(wú)法更改的值。

2.1.3. 當(dāng)處于rejected狀態(tài)時(shí),promise:

2.1.3.1. 禁止轉(zhuǎn)換成其他狀態(tài)。

2.1.3.2. 必須有一個(gè)無(wú)法更改的原因。

在這里,無(wú)法更改意味著全等(例如===),但是不代表深比較相等。

2.2 then方法

promise必須包含一個(gè)then方法來(lái)訪問(wèn)它當(dāng)前或者最終的值或者原因。

Promise的then方法接收兩個(gè)參數(shù):

promise.then(onFulfilled, onRejected)

2.1.1. onFulfilledonRejected函數(shù)有都有可選的參數(shù):

2.2.1.1. 如果onFulfilled不是一個(gè)函數(shù),那么它必須被忽略掉。

2.2.1.2. 如果onRejected不是一個(gè)函數(shù),那么它必須被忽略掉。

2.2.2. 如果onFulfilled是一個(gè)函數(shù):

2.2.2.1. 它必須在promise到fulfilled狀態(tài)后觸發(fā),promise的值是它的第一個(gè)參數(shù)。

2.2.2.2. 它在一個(gè)promise到fulfilled狀態(tài)之前禁止被觸發(fā)。

2.2.2.3. 它禁止被觸發(fā)多次。

2.2.3. 如果onRejected是一個(gè)函數(shù):

2.2.3.1. 它必須在promise到rejected狀態(tài)后觸發(fā),promise的原因是它的第一個(gè)參數(shù)。

2.3.2.2. 它在一個(gè)promise到rejected之前禁止被觸發(fā)。

2.3.2.3. 它禁止被觸發(fā)多次。

2.2.4. onFulfilled或者onRejected只有在執(zhí)行上下文堆棧只有平臺(tái)代碼時(shí)才能被觸發(fā)。

2.2.5. onFulfilledonRejected必須作為函數(shù)被調(diào)用(例如沒(méi)有this值)。

2.2.6. then方法可能在相同的promise中被調(diào)用多次。

2.2.6.1. 如果promise到了fullfilled狀態(tài),那么所有的onFulfilled回調(diào)函數(shù)都必須按照他們?cè)械捻樞蜻M(jìn)行調(diào)用執(zhí)行。

2.2.6.2. 如果promise到了rejected狀態(tài),那么所有的onRejected回調(diào)函數(shù)都必須按照他們?cè)械捻樞蜻M(jìn)行調(diào)用執(zhí)行。

2.2.7. then方法必須返回一個(gè)promise:

promise2 = promise1.then(onFulfilled, onRejected);

2.2.7.1. 如果onFulfilled或者onRejected方法返回一個(gè)值x,那么執(zhí)行promise的解析過(guò)程[[Resolve]](promise2, x)

2.2.7.2. 如果onFulfilled或者onRejected方法拋出一個(gè)異常epromise2必須使用e作為原因拒絕掉(rejected)。

2.2.7.3. 如果onFulfilled不是一個(gè)函數(shù)并且promise1到了fulfilled狀態(tài),那么promise2必須在與promise1的值相同的情況下轉(zhuǎn)換到fulfilled狀態(tài)。

2.2.7.4. 如果onRejected不是一個(gè)函數(shù)并且promise1到了rejected狀態(tài),那么promise2必須在與promise1的原因相同的情況下轉(zhuǎn)換到rejected狀態(tài)。

2.3. promise解析函數(shù)

promise解析函數(shù)是一個(gè)輸入一個(gè)promise或者一個(gè)值的抽象的操作,我們表示為[[Resolve]](promise, x)。如果x是一個(gè)thenable對(duì)象,在假定x的行為至少有點(diǎn)像一個(gè)promise的情況下,它會(huì)嘗試讓promise轉(zhuǎn)換到x的狀態(tài)。否則,他會(huì)用x的值完成promise的狀態(tài)。

這種thenable對(duì)象的方式允許promise實(shí)現(xiàn)交互,只要他們暴露一個(gè)符合Promise/A+規(guī)范的then函數(shù)。它還允許Promise/A+的實(shí)現(xiàn)支持一個(gè)有合適的then方法的不兼容的實(shí)現(xiàn)。

運(yùn)行[[Resolve]](promise, x),需要遵循以下步驟:

2.3.1. 如果promisex指向同一個(gè)對(duì)象,那么用TypeError作為原因拒絕promise。

2.3.2. 如果x是一個(gè)promise,判斷它的狀態(tài):

2.3.2.1. 如果x是pending狀態(tài),promise保留pending狀態(tài)直到x變成fulfilled狀態(tài)或者rejected狀態(tài)。

2.3.2.2. 如果x是fulfilled狀態(tài),那么用同樣的值將整個(gè)promise完成。

2.3.2.3. 如果x是rejected狀態(tài),那么用同樣的原因拒絕promise

2.3.3. 否則,如果x是一個(gè)對(duì)象或者函數(shù),

2.3.3.1. 讓then變成x.then

2.3.3.2. 如果在檢測(cè)x.then這個(gè)屬性的結(jié)果時(shí)拋出一個(gè)異常e,把e作為原因拒絕promise

2.3.3.3. 如果then是一個(gè)函數(shù),那么用x作為this來(lái)調(diào)用它,第一個(gè)參數(shù)是resolvePromise,第二個(gè)參數(shù)是rejectPromise

2.3.3.3.1. 如果resolvePromise被值y調(diào)用,那么運(yùn)行[[Resolve]](promise, y)

2.3.3.3.2. 如果rejectPromise被原因r觸發(fā),那么用r來(lái)拒絕promise

2.3.3.3.3. 如果resolvePromiserejectPromise都被調(diào)用,或者使用相同的參數(shù)多次調(diào)用,那么第一次調(diào)用生效,其他之后的任何調(diào)用都忽略掉。

2.3.3.3.4. 如果在調(diào)用then方法時(shí)拋出了一個(gè)異常e,

2.3.3.3.4.1. 如果resolvePromiserejectPromise已經(jīng)被調(diào)用了那么就忽略掉它。

2.3.3.3.4.2. 否則,使用e作為原因拒絕promise

2.3.3.4. 如果then不是一個(gè)函數(shù),那么用x完成promise

2.3.4. 如果x不是一個(gè)對(duì)象或者函數(shù),那么用x完成promise

如果一個(gè)promise是通過(guò)在環(huán)形的thenable鏈中的一個(gè)thenable來(lái)完成的,如遞歸的[[Resolve]](promise, thenable)類型再次調(diào)用[[Resolve]](promise, thenable),遵循上述的規(guī)則會(huì)導(dǎo)致無(wú)窮遞歸。對(duì)這種遞歸情況的檢測(cè)并且使用TypeError作為原因進(jìn)行拒絕,我們鼓勵(lì)實(shí)現(xiàn),但不要求。

3. 注意事項(xiàng)

3.1. 在這里"平臺(tái)代碼"(platform code)意味著引擎,環(huán)境和promise實(shí)現(xiàn)代碼。在實(shí)踐中,這個(gè)要求確保了onFulfilledonRejected是異步執(zhí)行的,then調(diào)用也是在循環(huán)之后,有一個(gè)新的堆棧信息。這可以通過(guò)一個(gè)宏任務(wù)(macro-task)機(jī)制例如setTimeout或者setImmediate來(lái)實(shí)現(xiàn),也可以通過(guò)一個(gè)微任務(wù)(micro-task)例如MutationObserver或者process.nextTick來(lái)實(shí)現(xiàn)。如果promise的實(shí)現(xiàn)考慮平臺(tái)代碼,那么它自己可能會(huì)帶一個(gè)任務(wù)執(zhí)行隊(duì)列或者“蹦床”來(lái)處理被調(diào)用情況。

3.2. 在嚴(yán)格模式下,this是在promise里面將會(huì)是undefined。在松散模型下,他代表的是全局對(duì)象。

3.3. 如果實(shí)現(xiàn)滿足所有要求的話,可以允許promise2 === promise1。每一個(gè)實(shí)現(xiàn)都應(yīng)該表明是否支持promise2 === promise1,如果支持則是需要在什么條件下。

3.4. 通常來(lái)說(shuō),如果按照當(dāng)前的實(shí)現(xiàn)方式,我們只能知道x是一個(gè)真的promise。這一條允許你在具體實(shí)現(xiàn)的使用過(guò)程中來(lái)判斷未知的promise的狀態(tài)。

3.5. 在程序中,首先存儲(chǔ)x.then的引用,其次測(cè)試這個(gè)引用,然后再調(diào)用這個(gè)引用,避免多次訪問(wèn)x.then屬性。這樣的預(yù)防措施對(duì)于確保那些會(huì)在兩次訪問(wèn)之間可能變化的屬性值獲取到一致的結(jié)果非常重要。

3.6. 實(shí)現(xiàn)中不應(yīng)該對(duì)thenable調(diào)用鏈值設(shè)置任意深度限制,而是應(yīng)該假設(shè)這個(gè)遞歸的限制值是無(wú)窮大。只有真正的循環(huán)才會(huì)導(dǎo)致TypeError;如果遇到了一個(gè)長(zhǎng)度為無(wú)窮大的不同的thenable,保證在正確的行為下一直遞歸。

總結(jié)

本文主要通過(guò)英文翻譯為中文的Promise/A+規(guī)范,讓大家了解了整個(gè)規(guī)范的全部?jī)?nèi)容。我會(huì)在下一篇博客中給大家?guī)?lái)如何實(shí)現(xiàn)一個(gè)完全符合Promise/A+規(guī)范的Promise。

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/97822.html

相關(guān)文章

  • 小而美的Promise庫(kù)——promiz源碼淺析

    摘要:因此,當(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...

    figofuture 評(píng)論0 收藏0
  • JavaScript 異步

    摘要:從最開(kāi)始的到封裝后的都在試圖解決異步編程過(guò)程中的問(wèn)題。為了讓編程更美好,我們就需要引入來(lái)降低異步編程的復(fù)雜性。寫一個(gè)符合規(guī)范并可配合使用的寫一個(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ò)...

    tuniutech 評(píng)論0 收藏0
  • 4月份前端資源分享

    摘要:更多資源請(qǐng)文章轉(zhuǎn)自月份前端資源分享關(guān)于的思考一款有趣的動(dòng)畫效果跨站資源共享之二最流行的編程語(yǔ)言能做什么到底什么是閉包的第三個(gè)參數(shù)跨域資源共享詳解阮一峰前端要給力之語(yǔ)句在中的值周愛(ài)民中國(guó)第二屆視頻花絮編碼規(guī)范前端工程師手冊(cè)奇舞周刊被忽視的 更多資源請(qǐng)Star:https://github.com/maidishike... 文章轉(zhuǎn)自:https://github.com/jsfron...

    jsdt 評(píng)論0 收藏0
  • 2017-07-20 前端日?qǐng)?bào)

    摘要:前端日?qǐng)?bào)精選入門指南工作原理的新功能前端本地存儲(chǔ)數(shù)據(jù)庫(kù)實(shí)例教程模塊深入探究調(diào)查問(wèn)卷中文譯掘金第期構(gòu)建高性能展開(kāi)收縮動(dòng)畫譯代碼檢查工具對(duì)比前端之旅譯年了,這么多前端框架,你會(huì)怎樣選擇掘金譯不配置,不出事那些坑其一前端面試的大 2017-07-20 前端日?qǐng)?bào) 精選 CSS入門指南-1:工作原理2017 Amsterdam CSS DayWebpack 3 的新功能:Scope Hoisti...

    JessYanCoding 評(píng)論0 收藏0
  • 從0開(kāi)始構(gòu)建自己的前端知識(shí)體系-JS-跟著規(guī)范學(xué)Promise

    摘要:本文僅限瀏覽器環(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)。可以認(rèn)為在實(shí)現(xiàn)里與中的都為解決程序。 前言 Promise作為ES6極為重要的一個(gè)特性,將我們從無(wú)限的回調(diào)地獄中解脫出來(lái),變?yōu)殒準(zhǔn)降木帉懟卣{(diào),大大提高的代碼的可讀性。 使用Promise是極為簡(jiǎn)單的,但只停留在會(huì)使用階段還是會(huì)讓我們不知不覺(jué)踩到一些坑的。本文會(huì)...

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

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

0條評(píng)論

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