Promises-A+规范

发表于 4年以前  | 总阅读数:858 次

概述

自从准备晋级之后,就拖更了很久了,既然晋级弄完了,那么也恢复更新了。

在面试别人的过程中,发现基本上没有人对整个Promise完全了解,因此希望通过这篇文章来帮助大家了解下Promise的全貌。本文的主要内容是Promise/A+规范的译文,主要是能够帮助大家了解下Promise的规范,以及解决在日常运用中遇到的一些问题。

原文地址为:https://promisesaplus.com/#point-1

如果需要测试一个Promise库是否符合Promise/A+规范,可以使用这个:https://github.com/promises-aplus/promises-tests。

原文概览

一个标准声明、可操作的JavaScript Promise——出自开发者,为了开发者。

一个promise代表一个异步操作的最终结果。与promise交互的主要方法是通过它的then函数。这个函数注册一个回调函数来接收promise最终的值(value)或者是没有成功的原因(reason)。

这篇文档详细说明了then方法的具体行为,它为所有的符合Promise/A+规范的实现提供了一个基础的交互。像这样,这个规范应该设计的非常稳定。尽管Promise/A+组织可能偶尔通过一些向后兼容的小修改来调整这个文档来适应新发现的场景,我们只会在经历过了小心的思考、讨论和测试后增加大的、不向后兼容的修改。

从历史上来看,Promise/A+阐述了更早的Promise/A的行为规范,并且在其基础上进行了扩展,覆盖了一些实际行为和之前遗漏的问题。

最终,核心的Promise/A+文档不关心如何去创建、完成(resolve)或者拒绝(reject)一个Promise,而是聚焦在提供一个可交互的then函数。在将来的其他规范中可能会涉及这些没有提及的内容。

1. 术语

1.1. "promise"是一个对象或者函数,它拥有一个符合文档中描述行为的then方法。

1.2. "thenable"是一个有then方法的对象或者函数。

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

1.4. "exception"是一个使用在throw语句中的抛出来的值。

1.5. "reason"是一个用来表示promise拒绝的原因的值。

2. 要求

2.1 promise状态

一个promise必须处于一下三种状态:pending、fulfilled或者rejected。

2.1.1. 当处于pending状态时,promise:

2.1.1.1. 可能会转换成任何其他的状态。

2.1.2. 当处于fulfilled状态时,promise:

2.1.2.1. 禁止转换成其他状态。

2.1.2.2. 必须有一个无法更改的值。

2.1.3. 当处于rejected状态时,promise:

2.1.3.1. 禁止转换成其他状态。

2.1.3.2. 必须有一个无法更改的原因。

在这里,无法更改意味着全等(例如===),但是不代表深比较相等。

2.2 then方法

promise必须包含一个then方法来访问它当前或者最终的值或者原因。

Promise的then方法接收两个参数:

promise.then(onFulfilled, onRejected)

2.1.1. onFulfilledonRejected函数有都有可选的参数:

2.2.1.1. 如果onFulfilled不是一个函数,那么它必须被忽略掉。

2.2.1.2. 如果onRejected不是一个函数,那么它必须被忽略掉。

2.2.2. 如果onFulfilled是一个函数:

2.2.2.1. 它必须在promise到fulfilled状态后触发,promise的值是它的第一个参数。

2.2.2.2. 它在一个promise到fulfilled状态之前禁止被触发。

2.2.2.3. 它禁止被触发多次。

2.2.3. 如果onRejected是一个函数:

2.2.3.1. 它必须在promise到rejected状态后触发,promise的原因是它的第一个参数。

2.3.2.2. 它在一个promise到rejected之前禁止被触发。

2.3.2.3. 它禁止被触发多次。

2.2.4. onFulfilled或者onRejected只有在执行上下文堆栈只有平台代码时才能被触发。

2.2.5. onFulfilledonRejected必须作为函数被调用(例如没有this值)。

2.2.6. then方法可能在相同的promise中被调用多次。

2.2.6.1. 如果promise到了fullfilled状态,那么所有的onFulfilled回调函数都必须按照他们原有的顺序进行调用执行。

2.2.6.2. 如果promise到了rejected状态,那么所有的onRejected回调函数都必须按照他们原有的顺序进行调用执行。

2.2.7. then方法必须返回一个promise:

promise2 = promise1.then(onFulfilled, onRejected);

2.2.7.1. 如果onFulfilled或者onRejected方法返回一个值x,那么执行promise的解析过程[[Resolve]](promise2, x)

2.2.7.2. 如果onFulfilled或者onRejected方法抛出一个异常epromise2必须使用e作为原因拒绝掉(rejected)。

2.2.7.3. 如果onFulfilled不是一个函数并且promise1到了fulfilled状态,那么promise2必须在与promise1的值相同的情况下转换到fulfilled状态。

2.2.7.4. 如果onRejected不是一个函数并且promise1到了rejected状态,那么promise2必须在与promise1的原因相同的情况下转换到rejected状态。

2.3. promise解析函数

promise解析函数是一个输入一个promise或者一个值的抽象的操作,我们表示为[[Resolve]](promise, x)。如果x是一个thenable对象,在假定x的行为至少有点像一个promise的情况下,它会尝试让promise转换到x的状态。否则,他会用x的值完成promise的状态。

这种thenable对象的方式允许promise实现交互,只要他们暴露一个符合Promise/A+规范的then函数。它还允许Promise/A+的实现支持一个有合适的then方法的不兼容的实现。

运行[[Resolve]](promise, x),需要遵循以下步骤:

2.3.1. 如果promisex指向同一个对象,那么用TypeError作为原因拒绝promise。

2.3.2. 如果x是一个promise,判断它的状态:

2.3.2.1. 如果x是pending状态,promise保留pending状态直到x变成fulfilled状态或者rejected状态。

2.3.2.2. 如果x是fulfilled状态,那么用同样的值将整个promise完成。

2.3.2.3. 如果x是rejected状态,那么用同样的原因拒绝promise

2.3.3. 否则,如果x是一个对象或者函数,

2.3.3.1. 让then变成x.then

2.3.3.2. 如果在检测x.then这个属性的结果时抛出一个异常e,把e作为原因拒绝promise

2.3.3.3. 如果then是一个函数,那么用x作为this来调用它,第一个参数是resolvePromise,第二个参数是rejectPromise

2.3.3.3.1. 如果resolvePromise被值y调用,那么运行[[Resolve]](promise, y)

2.3.3.3.2. 如果rejectPromise被原因r触发,那么用r来拒绝promise

2.3.3.3.3. 如果resolvePromiserejectPromise都被调用,或者使用相同的参数多次调用,那么第一次调用生效,其他之后的任何调用都忽略掉。

2.3.3.3.4. 如果在调用then方法时抛出了一个异常e,

2.3.3.3.4.1. 如果resolvePromiserejectPromise已经被调用了那么就忽略掉它。

2.3.3.3.4.2. 否则,使用e作为原因拒绝promise

2.3.3.4. 如果then不是一个函数,那么用x完成promise

2.3.4. 如果x不是一个对象或者函数,那么用x完成promise

如果一个promise是通过在环形的thenable链中的一个thenable来完成的,如递归的[[Resolve]](promise, thenable)类型再次调用[[Resolve]](promise, thenable),遵循上述的规则会导致无穷递归。对这种递归情况的检测并且使用TypeError作为原因进行拒绝,我们鼓励实现,但不要求。

3. 注意事项

3.1. 在这里"平台代码"(platform code)意味着引擎,环境和promise实现代码。在实践中,这个要求确保了onFulfilledonRejected是异步执行的,then调用也是在循环之后,有一个新的堆栈信息。这可以通过一个宏任务(macro-task)机制例如setTimeout或者setImmediate来实现,也可以通过一个微任务(micro-task)例如MutationObserver或者process.nextTick来实现。如果promise的实现考虑平台代码,那么它自己可能会带一个任务执行队列或者“蹦床”来处理被调用情况。

3.2. 在严格模式下,this是在promise里面将会是undefined。在松散模型下,他代表的是全局对象。

3.3. 如果实现满足所有要求的话,可以允许promise2 === promise1。每一个实现都应该表明是否支持promise2 === promise1,如果支持则是需要在什么条件下。

3.4. 通常来说,如果按照当前的实现方式,我们只能知道x是一个真的promise。这一条允许你在具体实现的使用过程中来判断未知的promise的状态。

3.5. 在程序中,首先存储x.then的引用,其次测试这个引用,然后再调用这个引用,避免多次访问x.then属性。这样的预防措施对于确保那些会在两次访问之间可能变化的属性值获取到一致的结果非常重要。

3.6. 实现中不应该对thenable调用链值设置任意深度限制,而是应该假设这个递归的限制值是无穷大。只有真正的循环才会导致TypeError;如果遇到了一个长度为无穷大的不同的thenable,保证在正确的行为下一直递归。

总结

本文主要通过英文翻译为中文的Promise/A+规范,让大家了解了整个规范的全部内容。我会在下一篇博客中给大家带来如何实现一个完全符合Promise/A+规范的Promise。

本文由哈喽比特于4年以前收录,如有侵权请联系我们。
文章来源:https://github.com/HJava/myBlog

 相关推荐

刘强东夫妇:“移民美国”传言被驳斥

京东创始人刘强东和其妻子章泽天最近成为了互联网舆论关注的焦点。有关他们“移民美国”和在美国购买豪宅的传言在互联网上广泛传播。然而,京东官方通过微博发言人发布的消息澄清了这些传言,称这些言论纯属虚假信息和蓄意捏造。

发布于:7月以前  |  808次阅读  |  详细内容 »

博主曝三大运营商,将集体采购百万台华为Mate60系列

日前,据博主“@超能数码君老周”爆料,国内三大运营商中国移动、中国电信和中国联通预计将集体采购百万台规模的华为Mate60系列手机。

发布于:7月以前  |  770次阅读  |  详细内容 »

ASML CEO警告:出口管制不是可行做法,不要“逼迫中国大陆创新”

据报道,荷兰半导体设备公司ASML正看到美国对华遏制政策的负面影响。阿斯麦(ASML)CEO彼得·温宁克在一档电视节目中分享了他对中国大陆问题以及该公司面临的出口管制和保护主义的看法。彼得曾在多个场合表达了他对出口管制以及中荷经济关系的担忧。

发布于:7月以前  |  756次阅读  |  详细内容 »

抖音中长视频App青桃更名抖音精选,字节再发力对抗B站

今年早些时候,抖音悄然上线了一款名为“青桃”的 App,Slogan 为“看见你的热爱”,根据应用介绍可知,“青桃”是一个属于年轻人的兴趣知识视频平台,由抖音官方出品的中长视频关联版本,整体风格有些类似B站。

发布于:7月以前  |  648次阅读  |  详细内容 »

威马CDO:中国每百户家庭仅17户有车

日前,威马汽车首席数据官梅松林转发了一份“世界各国地区拥车率排行榜”,同时,他发文表示:中国汽车普及率低于非洲国家尼日利亚,每百户家庭仅17户有车。意大利世界排名第一,每十户中九户有车。

发布于:7月以前  |  589次阅读  |  详细内容 »

研究发现维生素 C 等抗氧化剂会刺激癌症生长和转移

近日,一项新的研究发现,维生素 C 和 E 等抗氧化剂会激活一种机制,刺激癌症肿瘤中新血管的生长,帮助它们生长和扩散。

发布于:7月以前  |  449次阅读  |  详细内容 »

苹果据称正引入3D打印技术,用以生产智能手表的钢质底盘

据媒体援引消息人士报道,苹果公司正在测试使用3D打印技术来生产其智能手表的钢质底盘。消息传出后,3D系统一度大涨超10%,不过截至周三收盘,该股涨幅回落至2%以内。

发布于:7月以前  |  446次阅读  |  详细内容 »

千万级抖音网红秀才账号被封禁

9月2日,坐拥千万粉丝的网红主播“秀才”账号被封禁,在社交媒体平台上引发热议。平台相关负责人表示,“秀才”账号违反平台相关规定,已封禁。据知情人士透露,秀才近期被举报存在违法行为,这可能是他被封禁的部分原因。据悉,“秀才”年龄39岁,是安徽省亳州市蒙城县人,抖音网红,粉丝数量超1200万。他曾被称为“中老年...

发布于:7月以前  |  445次阅读  |  详细内容 »

亚马逊股东起诉公司和贝索斯,称其在购买卫星发射服务时忽视了 SpaceX

9月3日消息,亚马逊的一些股东,包括持有该公司股票的一家养老基金,日前对亚马逊、其创始人贝索斯和其董事会提起诉讼,指控他们在为 Project Kuiper 卫星星座项目购买发射服务时“违反了信义义务”。

发布于:7月以前  |  444次阅读  |  详细内容 »

苹果上线AppsbyApple网站,以推广自家应用程序

据消息,为推广自家应用,苹果现推出了一个名为“Apps by Apple”的网站,展示了苹果为旗下产品(如 iPhone、iPad、Apple Watch、Mac 和 Apple TV)开发的各种应用程序。

发布于:7月以前  |  442次阅读  |  详细内容 »

特斯拉美国降价引发投资者不满:“这是短期麻醉剂”

特斯拉本周在美国大幅下调Model S和X售价,引发了该公司一些最坚定支持者的不满。知名特斯拉多头、未来基金(Future Fund)管理合伙人加里·布莱克发帖称,降价是一种“短期麻醉剂”,会让潜在客户等待进一步降价。

发布于:7月以前  |  441次阅读  |  详细内容 »

光刻机巨头阿斯麦:拿到许可,继续对华出口

据外媒9月2日报道,荷兰半导体设备制造商阿斯麦称,尽管荷兰政府颁布的半导体设备出口管制新规9月正式生效,但该公司已获得在2023年底以前向中国运送受限制芯片制造机器的许可。

发布于:7月以前  |  437次阅读  |  详细内容 »

马斯克与库克首次隔空合作:为苹果提供卫星服务

近日,根据美国证券交易委员会的文件显示,苹果卫星服务提供商 Globalstar 近期向马斯克旗下的 SpaceX 支付 6400 万美元(约 4.65 亿元人民币)。用于在 2023-2025 年期间,发射卫星,进一步扩展苹果 iPhone 系列的 SOS 卫星服务。

发布于:7月以前  |  430次阅读  |  详细内容 »

𝕏(推特)调整隐私政策,可拿用户发布的信息训练 AI 模型

据报道,马斯克旗下社交平台𝕏(推特)日前调整了隐私政策,允许 𝕏 使用用户发布的信息来训练其人工智能(AI)模型。新的隐私政策将于 9 月 29 日生效。新政策规定,𝕏可能会使用所收集到的平台信息和公开可用的信息,来帮助训练 𝕏 的机器学习或人工智能模型。

发布于:7月以前  |  428次阅读  |  详细内容 »

荣耀CEO谈华为手机回归:替老同事们高兴,对行业也是好事

9月2日,荣耀CEO赵明在采访中谈及华为手机回归时表示,替老同事们高兴,觉得手机行业,由于华为的回归,让竞争充满了更多的可能性和更多的魅力,对行业来说也是件好事。

发布于:7月以前  |  423次阅读  |  详细内容 »

AI操控无人机能力超越人类冠军

《自然》30日发表的一篇论文报道了一个名为Swift的人工智能(AI)系统,该系统驾驶无人机的能力可在真实世界中一对一冠军赛里战胜人类对手。

发布于:7月以前  |  423次阅读  |  详细内容 »

AI生成的蘑菇科普书存在可致命错误

近日,非营利组织纽约真菌学会(NYMS)发出警告,表示亚马逊为代表的电商平台上,充斥着各种AI生成的蘑菇觅食科普书籍,其中存在诸多错误。

发布于:7月以前  |  420次阅读  |  详细内容 »

社交媒体平台𝕏计划收集用户生物识别数据与工作教育经历

社交媒体平台𝕏(原推特)新隐私政策提到:“在您同意的情况下,我们可能出于安全、安保和身份识别目的收集和使用您的生物识别信息。”

发布于:7月以前  |  411次阅读  |  详细内容 »

国产扫地机器人热销欧洲,国产割草机器人抢占欧洲草坪

2023年德国柏林消费电子展上,各大企业都带来了最新的理念和产品,而高端化、本土化的中国产品正在不断吸引欧洲等国际市场的目光。

发布于:7月以前  |  406次阅读  |  详细内容 »

罗永浩吐槽iPhone15和14不会有区别,除了序列号变了

罗永浩日前在直播中吐槽苹果即将推出的 iPhone 新品,具体内容为:“以我对我‘子公司’的了解,我认为 iPhone 15 跟 iPhone 14 不会有什么区别的,除了序(列)号变了,这个‘不要脸’的东西,这个‘臭厨子’。

发布于:7月以前  |  398次阅读  |  详细内容 »
 目录