====== 差别 ======
这里会显示出您选择的修订版和当前版本之间的差别。
后一修订版 | 前一修订版 上一修订版 两侧同时换到之后的修订记录 | ||
javascript_promisea_规范 [2022/04/06 17:34] 若愚 创建 |
javascript_promisea_规范 [2022/04/06 18:18] 若愚 |
||
---|---|---|---|
行 4: | 行 4: | ||
1. https:// | 1. https:// | ||
1. https:// | 1. https:// | ||
+ | |||
+ | ## Terminology | ||
+ | |||
+ | 1. " | ||
+ | 1. " | ||
+ | 1. " | ||
+ | 1. " | ||
+ | 1. " | ||
+ | |||
+ | ## Requirements | ||
+ | |||
+ | ### Promise States | ||
+ | |||
+ | A promise must be in one of three states: pending, fulfilled, or rejected. | ||
+ | |||
+ | 1. When pending, a promise: | ||
+ | 1. may transition to either the fulfilled or rejected state. | ||
+ | 1. When fulfilled, a promise: | ||
+ | 1. must not transition to any other state. | ||
+ | 1. must have a value, which must not change. | ||
+ | 1. When rejected, a promise: | ||
+ | 1. must not transition to any other state. | ||
+ | 1. must have a reason, which must not change. | ||
+ | |||
+ | Here, "must not change" | ||
+ | |||
+ | ### The `then` Method | ||
+ | |||
+ | A promise must provide a `then` method to access its current or eventual value or reason. | ||
+ | |||
+ | A promise' | ||
+ | |||
+ | ```js | ||
+ | promise.then(onFulfilled, | ||
+ | ``` | ||
+ | |||
+ | 补充范例1: | ||
+ | |||
+ | ```javascript | ||
+ | let p = new Promise(function(resolve, | ||
+ | setTimeout(function() { resolve(1) }, 1000) | ||
+ | }) | ||
+ | p.then(function(x) {}, function(reason) {}) | ||
+ | ``` | ||
+ | |||
+ | 1. Both `onFulfilled` and `onRejected` are optional arguments: | ||
+ | 1. If `onFulfilled` is not a function, it must be ignored. | ||
+ | 1. If `onRejected` is not a function, it must be ignored. | ||
+ | 1. If `onFulfilled` is a function: | ||
+ | 1. it must be called after `promise` is fulfilled, with `promise`' | ||
+ | 1. it must not be called before `promise` is fulfilled. | ||
+ | 1. it must not be called more than once. | ||
+ | 1. If `onRejected` is a function, | ||
+ | 1. it must be called after `promise` is rejected, with `promise`' | ||
+ | 1. it must not be called before `promise` is rejected. | ||
+ | 1. it must not be called more than once. | ||
+ | 1. `onFulfilled` or `onRejected` must not be called until the [execution context](https:// | ||
+ | 1. `onFulfilled` and `onRejected` must be called as functions (i.e. with no `this` value). [[3.2](# | ||
+ | 1. `then` may be called multiple times on the same promise. | ||
+ | 1. If/when `promise` is fulfilled, all respective `onFulfilled` callbacks must execute in the order of their originating calls to `then`. | ||
+ | 1. If/when `promise` is rejected, all respective `onRejected` callbacks must execute in the order of their originating calls to `then`. | ||
+ | 1. `then` must return a promise [[3.3](# | ||
+ | |||
+ | ```js | ||
+ | promise2 = promise1.then(onFulfilled, | ||
+ | ``` | ||
+ | |||
+ | 1. If either `onFulfilled` or `onRejected` returns a value `x`, run the Promise Resolution Procedure `[[Resolve]](promise2, | ||
+ | 1. If either `onFulfilled` or `onRejected` throws an exception `e`, `promise2` must be rejected with `e` as the reason. | ||
+ | 1. If `onFulfilled` is not a function and `promise1` is fulfilled, `promise2` must be fulfilled with the same value as `promise1`. | ||
+ | 1. If `onRejected` is not a function and `promise1` is rejected, `promise2` must be rejected with the same reason as `promise1`. | ||
+ | |||
+ | ### The Promise Resolution Procedure | ||
+ | |||
+ | The **promise resolution procedure** is an abstract operation taking as input a promise and a value, which we denote as `[[Resolve]](promise, | ||
+ | |||
+ | This treatment of thenables allows promise implementations to interoperate, | ||
+ | |||
+ | To run `[[Resolve]](promise, | ||
+ | |||
+ | 1. If `promise` and `x` refer to the same object, reject `promise` with a `TypeError` as the reason. | ||
+ | 1. If `x` is a promise, adopt its state [[3.4](# | ||
+ | 1. If `x` is pending, `promise` must remain pending until `x` is fulfilled or rejected. | ||
+ | 1. If/when `x` is fulfilled, fulfill `promise` with the same value. | ||
+ | 1. If/when `x` is rejected, reject `promise` with the same reason. | ||
+ | 1. Otherwise, if `x` is an object or function, | ||
+ | 1. Let `then` be `x.then`. [[3.5](# | ||
+ | 1. If retrieving the property `x.then` results in a thrown exception `e`, reject `promise` with `e` as the reason. | ||
+ | 1. If `then` is a function, call it with `x` as `this`, first argument `resolvePromise`, | ||
+ | 1. If/when `resolvePromise` is called with a value `y`, run `[[Resolve]](promise, | ||
+ | 1. If/when `rejectPromise` is called with a reason `r`, reject `promise` with `r`. | ||
+ | 1. 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. | ||
+ | 1. If calling `then` throws an exception `e`, | ||
+ | 1. If `resolvePromise` or `rejectPromise` have been called, ignore it. | ||
+ | 1. Otherwise, reject `promise` with `e` as the reason. | ||
+ | 1. If `then` is not a function, fulfill `promise` with `x`. | ||
+ | 1. If `x` is not an object or function, fulfill `promise` with `x`. | ||
+ | |||
+ | If a promise is resolved with a thenable that participates in a circular thenable chain, such that the recursive nature of `[[Resolve]](promise, | ||
+ | |||
+ | ## Notes | ||
+ | |||
+ | 1. Here " | ||
+ | |||
+ | 1. That is, in strict mode `this` will be `undefined` inside of them; in sloppy mode, it will be the global object. | ||
+ | |||
+ | 1. Implementations may allow `promise2 === promise1`, provided the implementation meets all requirements. Each implementation should document whether it can produce `promise2 === promise1` and under what conditions. | ||
+ | |||
+ | 1. Generally, it will only be known that `x` is a true promise if it comes from the current implementation. This clause allows the use of implementation-specific means to adopt the state of known-conformant promises. | ||
+ | |||
+ | 1. This procedure of first storing a reference to `x.then`, then testing that reference, and then calling that reference, avoids multiple accesses to the `x.then` property. Such precautions are important for ensuring consistency in the face of an accessor property, whose value could change between retrievals. | ||
+ | |||
+ | 1. Implementations should *not* set arbitrary limits on the depth of thenable chains, and assume that beyond that arbitrary limit the recursion will be infinite. Only true cycles should lead to a `TypeError`; | ||
+ | |||
## 规范解析 | ## 规范解析 |