十五的学习日记20161004
JavaScript
promise/A+标准
-
术语
- 1.1
promise是一种object或function,带有一个方法名叫then,这个方法的行为遵照本标准设定. - 1.2
thenable意味着一个object或function定义了then方法. - 1.3
value是任何合法的JavaScript 值(包括undefined,thenable或者promise) - 1.4
exception是一个通过throw声明抛出的值. - 1.5
reason是一个解释为什么一个promise被拒绝的词.
- 1.1
-
要求
-
2.1
promise的状态:
一个promise必须在三个状态中:pending,fulfilled,rejected.- 2.1.1 当一个 promise处于
pending状态时:- 2.1.1.1 有可能转变到
fulfilled或rejected状态.
- 2.1.1.1 有可能转变到
- 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.1.1 当一个 promise处于
-
2.2
then方法:
一个promise必须提供一个then方法, 以用来传递他当前或最终的value或reason
一个promise的then方法接受两个参数:
promise.then(onFulfilled,onRejected)- 2.2.1
onFulfilled,onRejected两者都是可选参数, 如果参数不为function类型,必须被忽略. - 2.2.2 如果
onFulfilled是一个function:- 2.2.2.1 它必须在
promise成为fulfilled状态后被调用,并且将promise的value作为其第一个参数传入.//想问参数在哪里?resolve(arg)传入参数 - 2.2.2.2 它不能在
promise成为fulfilled状态前被调用. - 2.2.2.3 它不能被调用超过一次.
- 2.2.2.1 它必须在
- 2.2.3 如果
onRejected是一个function:- 2.2.3.1 它必须在
promise成为onRejected状态后被调用,并且将promise的reason作为其第一个参数传入.//想问参数在哪里?resolve(arg)传入参数 - 2.2.3.2 它不能在
promise成为onRejected状态前被调用. - 2.2.3.3 它不能被调用超过一次.
- 2.2.3.1 它必须在
- 2.2.4 在执行上下文栈(
execution context stack)中只剩下平台代码前onFulfilled或onRejected都不能被调用.
//下面把完成与失败简写做yes和no. - 2.2.5
yes或no必须以函数来调用(也就是没有this 的值). - 2.2.6 在同一个
promise上then可以被多次调用.- 2.2.6.1 当且仅当
promise是yes时, 所有的onyes回调必须各自按他们then最原初的顺序执行. - 2.2.6.2 当且仅当
promise是no时, 所有的onno回调必须各自按他们then最原初的顺序执行.
- 2.2.6.1 当且仅当
- 2.2.7
then必须返回一个promise; - 例如:
promise2 = promise1.then(onyes,onno);- 2.2.7.1 不管是
onyes或onno返回了一个值x, 执行Promise Resolution Procedure(promise 解决程序)[[Resolve]](promise2, x). - 2.2.7.2 不管是
onyes或onno抛出了一个异常e ,promise2必须获取值e作为no的reason - 2.2.7.3 如果
onyes不是一个函数,而 promise1完成了yes状态,promise2必须以yes状态接受promise1的值. - 2.2.7.4 如果
onno不是一个函数,而 promise1完成了no状态,promise2必须以no状态接受promise1的值.
- 2.2.7.1 不管是
- 2.2.1
-
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 如果
promise和x指向了同一个对象,promise转为no并带着一个类型错误作为理由. -
2.3.2 如果
x是一个promise那么调整他的状态:- 2.3.2.1 如果
x处于pending,promise必须保持pending直到x转为yes或no. - 2.3.2.2 如果
x转到了yes,promise也应该yes并带上同样的value. - 2.3.2.3 如果
x转到了no,promise也应该no并带上同样的reason.
- 2.3.2.1 如果
-
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,转变promise为no带着理由r. - 2.3.3.3.3 如果
resolvePromise和rejectPromise都被调用了,或多重调用到了同一个参数,第一个调用被保留,其他的调用忽略. - 2.3.3.3.4 如果 调用的
then抛出一个异常e.- 2.3.3.3.4.1 如果
resolvePromise或rejectPromise已经被调用了, 忽略这个异常. - 2.3.3.3.4.2 否则,
promise转为no带着理由e.
- 2.3.3.3.4.1 如果
- 2.3.3.3.1 如果
- 2.3.3.4 如果
then不是一个函数,promise转为yes,带着值x.
- 2.3.3.1 让
-
2.3.4 如果x不是一个对象或函数,
promise转为yes带着值x.
如果一个promise转为了yes,带着一个进入了thenable构成的循环链的then,以至于递归地导致[[Resolve]](promise, thenable)重复无限地被调用.实现是鼓励的,但是并没有必要,可以用一个非正式的类型异常结束.
-
-
3注意
- 3.1 这里的"平台代码"意味着引擎,环境,和promise实现代码. 实际上, 这个需求保证了
onyes和onno可以异步地执行, 在事件循环轮到了一个then后,带着一个空的栈.这可以被实现为一个宏任务机制,比如setTimeout或者setImmediate, 或者一个微任务机制,比如MutationObserver或process.nextTick.这promise实现被认为是平台代码, 他们可能自身包含一个任务规划队列,或在某个handlers中被调用. - 3.2 在严格模式中,this会指向undefined,而在宽松模式中,他指向全局对象.
- 3.3 具体实现可能会允许
promise2 === promise1, 假设这两个promise的需求完全一致.每个具体实现必须在文档中指明是否会出现这样的情况,以及在何时出现. - 3.4 通常而言, ....
- 3.5 第一次储存
x.then的步骤... - 3.6 允许封闭环递归.
- 3.1 这里的"平台代码"意味着引擎,环境,和promise实现代码. 实际上, 这个需求保证了
-