• 十五的学习日记20161004


    十五的学习日记20161004


    JavaScript

    promise/A+标准

    1. 术语

      • 1.1 promise 是一种 objectfunction,带有一个方法名叫then,这个方法的行为遵照本标准设定.
      • 1.2 thenable 意味着一个objectfunction 定义了 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 当一个 promise处于pending状态时:
          • 2.1.1.1 有可能转变到fulfilledrejected状态.
        • 2.1.2 当一个 promise处于fulfilled状态时:
          • 2.1.2.1 不能再转变到其他状态.
          • 2.1.2.2 必须要有一个不变的value.
        • 2.1.3 当一个 promise处于rejected状态时:
          • 2.1.3.1 不能再转变到其他状态
          • 2.1.3.2 必须要一个不变的reason.
      • 2.2 then方法:
        一个 promise 必须提供一个then方法, 以用来传递他当前或最终的valuereason
        一个 promisethen方法接受两个参数:
        promise.then(onFulfilled,onRejected)

        • 2.2.1 onFulfilled,onRejected两者都是可选参数, 如果参数不为function类型,必须被忽略.
        • 2.2.2 如果onFulfilled 是一个function:
          • 2.2.2.1 它必须在promise成为fulfilled状态后被调用,并且将promisevalue作为其第一个参数传入.//想问参数在哪里?resolve(arg)传入参数
          • 2.2.2.2 它不能在promise成为fulfilled状态前被调用.
          • 2.2.2.3 它不能被调用超过一次.
        • 2.2.3 如果onRejected 是一个function:
          • 2.2.3.1 它必须在promise成为onRejected状态后被调用,并且将promisereason作为其第一个参数传入.//想问参数在哪里?resolve(arg)传入参数
          • 2.2.3.2 它不能在promise成为onRejected状态前被调用.
          • 2.2.3.3 它不能被调用超过一次.
        • 2.2.4 在执行上下文栈(execution context stack)中只剩下平台代码前onFulfilledonRejected 都不能被调用.
          //下面把完成与失败简写做yes和no.
        • 2.2.5 yesno 必须以函数来调用(也就是没有this 的值).
        • 2.2.6 在同一个promisethen 可以被多次调用.
          • 2.2.6.1 当且仅当 promiseyes时, 所有的onyes回调必须各自按他们then最原初的顺序执行.
          • 2.2.6.2 当且仅当 promiseno时, 所有的onno回调必须各自按他们then最原初的顺序执行.
        • 2.2.7 then必须返回一个promise;
        • 例如:
          promise2 = promise1.then(onyes,onno);
          • 2.2.7.1 不管是onyesonno 返回了一个值x, 执行Promise Resolution Procedure(promise 解决程序) [[Resolve]](promise2, x).
          • 2.2.7.2 不管是onyesonno 抛出了一个异常e , promise2 必须获取值e作为noreason
          • 2.2.7.3 如果onyes不是一个函数,而 promise1完成了yes状态,promise2必须以yes状态接受 promise1的值.
          • 2.2.7.4 如果onno不是一个函数,而 promise1完成了no状态,promise2必须以no状态接受 promise1的值.
      • 2.3 Promise 解决过程

      • promise 解决过程是一个以输入promise输出value的抽象操作,我们将此标记为:[[Resolve]](promise,x).如果x 是一个thenable, 那么会尝试尽量让promise接受x的状态, 假设x的表现会像一个promise.否则 那会让promise转为yes状态.

      • 这种处理允许promise的实现互操作,只要他们暴露的接口符合Promises/A+的then规范.也同时让Promises/A+以可理解的方式实现then方法.

      • 为了运转[[Resolve]](promise,x),须按照如下规则实现:

        • 2.3.1 如果promisex指向了同一个对象,promise转为no并带着一个类型错误作为理由.

        • 2.3.2 如果x是一个promise 那么调整他的状态:

          • 2.3.2.1 如果x处于 pending,promise必须保持pending直到x转为yesno.
          • 2.3.2.2 如果x转到了yes, promise也应该yes并带上同样的value.
          • 2.3.2.3 如果x转到了no, promise也应该no并带上同样的reason.
        • 2.3.3 其他情况,如果x是一个对象或函数.

          • 2.3.3.1 让then 转为x.then.
          • 2.3.3.2 如果属性 x.then 取回时抛出异常e,promise 转换为no 以e 作为 reason.
          • 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,转变promiseno带着理由r.
            • 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 否则, promise转为no带着理由e.
          • 2.3.3.4 如果 then不是一个函数, promise转为yes,带着值x.
        • 2.3.4 如果x不是一个对象或函数, promise转为yes带着值x.
          如果一个promise转为了yes,带着一个进入了thenable构成的循环链的then,以至于递归地导致[[Resolve]](promise, thenable) 重复无限地被调用.实现是鼓励的,但是并没有必要,可以用一个非正式的类型异常结束.

      • 3注意

        • 3.1 这里的"平台代码"意味着引擎,环境,和promise实现代码. 实际上, 这个需求保证了 onyesonno可以异步地执行, 在事件循环轮到了一个then后,带着一个空的栈.这可以被实现为一个宏任务机制,比如setTimeout或者setImmediate, 或者一个微任务机制,比如MutationObserverprocess.nextTick.这promise实现被认为是平台代码, 他们可能自身包含一个任务规划队列,或在某个handlers中被调用.
        • 3.2 在严格模式中,this会指向undefined,而在宽松模式中,他指向全局对象.
        • 3.3 具体实现可能会允许promise2 === promise1, 假设这两个promise的需求完全一致.每个具体实现必须在文档中指明是否会出现这样的情况,以及在何时出现.
        • 3.4 通常而言, ....
        • 3.5 第一次储存x.then的步骤...
        • 3.6 允许封闭环递归.
  • 相关阅读:
    超级简单:一步一步教你创建一小型的asp.net mvc 应用程序
    asp.net AJAX 验证用户名是否存在 Jquery
    生成缩略图、为图片添加文字水印、图片水印的类
    图Graph
    [转]Implementing a Generic Binary Tree in C#
    .net C#数据结构
    Why HTML5 is worth your time
    跳跃表SkipList
    C# LockFreeStack类
    [转]泛型弱引用
  • 原文地址:https://www.cnblogs.com/always-naive/p/5933801.html
Copyright © 2020-2023  润新知