最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • PromiseA+ 规范

    正文概述 掘金(邶念)   2021-04-19   728

    术语

    1. promise 是一个有then方法的对象或者是函数,行为遵循本规范。
    2. thenable 是一个有then方法的对象或者是函数。
    3. value 是 promise 状态成功时的值,也就是 resolve 的参数, 包括各种数据类型, 也包括 undefined/thenable 或者是 promise。
    4. reason 是 promise 状态失败时的值, 也就是 reject 的参数, 表示拒绝的原因
    5. exception 是一个使用 throw 抛出的异常值。

    定义

    Promise 表示一个异步操作的最终结果,与之进行交互的方式主要是 then 方法,该方法注册了两个回调函数,用于接收 promise 的终值或本 promise 不能执行的原因。

    简单来说:Promise 是一个拥有 then 方法的对象或者函数。

    状态

    1. 等待态(Pending):初始状态,可改变。
    2. 执行态(Fulfilled):最终态,不可变,必须拥有一个 value 值。
    3. 拒绝态(Rejected):最终态,不可变,必须拥有一个 reason 值。
    // 状态流转:
    pending --> resolve(value) --> fulfilled;
    pending --> reject(reason) --> rejected;
    

    then

    promise 必须提供一个 then 方法以访问其当前值、种植和据因

    // 参数要求:必须是函数类型,如果不是,则被忽略。
    // 这两个参数应该是 微任务。这里用queueMicrotask来实现微任务的调用
    Promise.then(onFulfilled,onRejected);
    
    • onFulfilled 特性:
    1. 只能被调用一次;
    2. 在 promise 变成 fulfilled 前不可被调用;
    3. 当 promise 执行结束后必须被调用,第一个参数是 promise 的终值。
    • onRejected 特性:
    1. 只能被调用一次;
    2. 在 promise 变成 rejected 之前不用管被调用;
    3. 当 promise 执行结束后必须被调用,第一个参数是 promise 的终值。

    then 方法可以被调用多次

    1. promise状态变成 fulfilled 后,所有的 onFulfilled 回调都需要按照then的顺序执行, 也就是按照注册顺序执行(所以在实现的时候需要一个数组来存放多个onFulfilled的回调)
    2. promise状态变成 rejected 后,所有的 onRejected 回调都需要按照then的顺序执行, 也就是按照注册顺序执行(所以在实现的时候需要一个数组来存放多个onRejected的回调)

    then 应该返回一个 promise

    promise2 = promise1.then(onFulfilled,onRejected);
    
    1. onFulfilled 或 onRejected 执行的结果为x, 调用 resolvePromise;
    2. 如果 onFulfilled 或者 onRejected 执行时抛出异常e, promise2需要被reject;
    3. 如果 onFulfilled 不是一个函数, promise2 以promise1的value 触发fulfilled;
    4. 如果 onRejected 不是一个函数, promise2 以promise1的reason 触发rejected;

    resolvePromise

    resolvePromise(newPromise,x,resolve,reject)
    
    • 如果 promise2 和 x 相等,那么 reject TypeError;
    • 如果 x 是一个 promsie:
    1. 如果 x 是pending态,那么 promise 必须要在 pending,直到 x 变成 fulfilled or rejected;
    2. 如果 x 被 fulfilled,fulfill promise with the same value
    3. 如果 x 被 rejected,reject promise with the same reason
    x.then((y) => {
        this.resolvePromise(newPromise, y, resolve, reject);
    }, reject);
    
    • 如果 x 是一个 object or function

    let then = x.then

    1. 如果 x.then 这步出错,那么 reject promise with e as the reason
    2. 如果 then 不是一个function,那么 fulfill promise with x
    3. 如果 then 是一个函数,,then.call(x, resolvePromiseFn, rejectPromise)

    3.1. resolvePromiseFn 的 入参是 y, 执行 resolvePromise(promise2, y, resolve, reject);
    3.2. rejectPromise 的 入参是 r, reject promise with r;
    3.3. 如果 resolvePromise 和 rejectPromise 都调用了,那么第一个调用优先,后面的调用忽略;
    3.4. 如果调用then抛出异常e ,如果 resolvePromise 或 rejectPromise 已经被调用,那么忽略则,reject promise with e as the reason


    起源地下载网 » PromiseA+ 规范

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元