分享更有价值
被信任是一种快乐

怎么写出符合Promise/A+ 规范Promise的源码

文章页正文上

这篇文章主要介绍“怎么写出符合Promise/A+ 规范Promise的源码”,在日常操作中,相信很多人在怎么写出符合Promise/A+ 规范Promise的源码问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么写出符合Promise/A+ 规范Promise的源码”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!Promise的源码实现有专门的测试脚本可以测试所编写的代码是否符合PromiseA+的规范。首先,在promise实现的代码中,增加以下代码:安装测试脚本:如果当前的promise源码的文件名为promise.js那么在对应的目录执行以下命令:promises-aplus-tests中共有872条测试用例。以上代码,可以完美通过所有用例。对上面的代码实现做一点简要说明(其它一些内容注释中已经写得很清楚):onFulfilled 和 onFulfilled的调用需要放在setTimeout,因为规范中表示: onFulfilled or onRejected must not be called until the execution context stack contains only platform code。使用setTimeout只是模拟异步,原生Promise并非是这样实现的。 2. 在 resolvePromise 的函数中,为何需要usedd这个flag,同样是因为规范中明确表示: If both resolvePromise and rejectPromise are called, or multiple calls to the same argument are made, the first call takes precedence, and any further calls are ignored. 因此我们需要这样的flag来确保只会执行一次。 3. self.onFulfilled 和 self.onRejected 中存储了成功的回调和失败的回调,根据规范2.6显示,当promise从pending态改变的时候,需要按照顺序去指定then对应的回调。PromiseA+的规范(翻译版)PS: 下面是我翻译的规范,供参考术语 promise 是一个有then方法的对象或者是函数,行为遵循本规范 thenable 是一个有then方法的对象或者是函数 value 是promise状态成功时的值,包括 undefined/thenable或者是 promise exception 是一个使用throw抛出的异常值 reason 是promise状态失败时的值要求2.1 Promise StatesPromise 必须处于以下三个状态之一: pending, fulfilled 或者是 rejected2.1.1 如果promise在pending状态2.1.2 如果promise在fulfilled状态2.1.3 如果promise在rejected状态概括即是:promise的状态只能从pending变成fulfilled,或者从pending变成rej免费云主机、域名ected.promise成功,有成功的value.promise失败的话,有失败的原因2.2 then方法promise必须提供一个then方法,来访问最终的结果promise的then方法接收两个参数2.2.1 onFulfilled 和 onRejected 都是可选参数2.2.2 如果 onFulfilled 是函数:2.2.3 如果 onRejected 是函数:2.2.4 onFulfilled 和 onRejected 应该是微任务2.2.5 onFulfilled 和 onRejected 必须作为函数被调用2.2.6 then方法可能被多次调用2.2.7 then必须返回一个promise2.3 resolvePromiseresolvePromise(promise2, x, resolve, reject)2.3.1 如果 promise2 和 x 相等,那么 reject promise with a TypeError2.3.2 如果 x 是一个 promsie2.3.3 如果 x 是一个 object 或者 是一个 function2.3.4 如果 x 不是一个 object 或者 function,fulfill promise with x.Promise的其他方法虽然上述的promise源码已经符合PromiseA+的规范,但是原生的Promise还提供了一些其他方法,如:Promise.resolve()Promise.reject()Promise.prototype.catch()Promise.prototype.finally()Promise.all()Promise.race()下面具体说一下每个方法的实现:Promise.resolvePromise.resolve(value) 返回一个以给定值解析后的Promise 对象.如果 value 是个 thenable 对象,返回的promise会“跟随”这个thenable的对象,采用它的最终状态如果传入的value本身就是promise对象,那么Promise.resolve将不做任何修改、原封不动地返回这个promise对象。其他情况,直接返回以该值为成功状态的promise对象。thenable对象的执行加 setTimeout的原因是根据原生Promise对象执行的结果推断的,如下的测试代码,原生的执行结果为: 20 400 30;为了同样的执行顺序,增加了setTimeout延时。测试代码:Promise.rejectPromise.reject方法和Promise.resolve不同,Promise.reject()方法的参数,会原封不动地作为reject的理由,变成后续方法的参数。Promise.prototype.catchPromise.prototype.catch 用于指定出错时的回调,是特殊的then方法,catch之后,可以继续 .thenPromise.prototype.finally不管成功还是失败,都会走到finally中,并且finally之后,还可以继续then。并且会将值原封不动的传递给后面的then.Promise.allPromise.all(promises) 返回一个promise对象如果传入的参数是一个空的可迭代对象,那么此promise对象回调完成(resolve),只有此情况,是同步执行的,其它都是异步返回的。如果传入的参数不包含任何 promise,则返回一个异步完成.promises 中所有的promise都promise都“完成”时或参数中不包含 promise 时回调完成。如果参数中有一个promise失败,那么Promise.all返回的pr

相关推荐: css3支持的浏览器内核是什么

这篇文章主要介绍“css3支持的浏览器内核是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“css3支持的浏览器内核是什么”文章能帮助大家解决问题。 css3支持的浏览器内核:1、Webkit,私有属性前缀是“-we…

文章页内容下
赞(0) 打赏
版权声明:本站采用知识共享、学习交流,不允许用于商业用途;文章由发布者自行承担一切责任,与本站无关。
文章页正文下
文章页评论上

云服务器、web空间可免费试用

宝塔面板主机、支持php,mysql等,SSL部署;安全高速企业专供99.999%稳定,另有高防主机、不限制内容等类型,具体可咨询QQ:360163164,Tel同微信:18905205712

主机选购导航云服务器试用

登录

找回密码

注册