1.reject 函数调用时参数类型
I. 一般类型, 非 promise 实例
此时该参数直接传给 promise 实例的 then 函数
II.promise 实例
- const p1 = new Promise(function (resolve, reject) {
- // ...
- });
- const p2 = new Promise(function (resolve, reject) {
- // ...
- resolve(p1);
- });
- // 此时, p2 的状态无效, p1 的状态决定了 p2 的状态
- p2.then(function(){
- })
2.Promise.prototype.then()的返回值问题
promise 实例在调用 then 方法时, 其第一个参数是 resolved 状态的回调函数, 第二个参数 (可选) 是 rejected 状态的回调函数
I. 前一个 then 方法指定的回调函数里返回非 promise 实例的值
- getJSON("/posts.json").then(function(JSON) {
- return JSON.post;
- }).then(function(post) {
- // ...
- });
此时, 第一个 then 返回一个新的 promise 实例, 并将 JSON.post 传给第二个 then
II. 前一个 then 方法指定的回调函数里返回 promise 实例
- getJSON("/posts.json").then(function(JSON) {
- //p1 为 promise 实例
- return p1;
- }).then(function(post) {
- // ...
- });
此时, 第一个 then 返回的是 p1, 第二个 then 则针对 p1 操作
3.Promise 的方法
- I.Promise.all()
- //all,race,allSettled,any 等方法都是传入数组实例
- const p = Promise.all([p1, p2, p3]);
p1,p2,p3 为 promise 实例 (如果不是 promise 实例, 会先调用 Promise.resolve() 方法先转为 promise 实例)
(1)只有 p1,p2,p3 的状态都变成 fulfilled,p 的状态才会变成 fulfilled, 此时 p1,p2,p3 的返回值组成一个数组, 传递给 p 的回调函数.
(2)只要 p1,p2,p3 之中有一个被 rejected,p 的状态就变成 rejected, 此时第一个被 reject 的实例的返回值, 会传递给 p 的回调函数.
II.Promise.race()
只要 p1,p2,p3 之中有一个实例率先改变状态, p 的状态就跟着改变. 那个率先改变的 Promise 实例的返回值, 就传递给 p 的回调函数
III.Promise.allSettled()
只有等到所有这些参数实例都返回结果, 不管是 fulfilled 还是 rejected, 包装实例才会结束.
该方法返回的新的 Promise 实例, 一旦结束, 状态总是 fulfilled, 不会变成 rejected. 状态变成 fulfilled 后, Promise 的监听函数接收到的参数是一个数组, 每个成员对应一个传入 Promise.allSettled()的 Promise 实例.
有时候, 我们不关心异步操作的结果, 只关心这些操作有没有结束. 这时, Promise.allSettled()方法就很有用.
IV.Promise.any()
只要参数实例有一个变成 fulfilled 状态, 包装实例就会变成 fulfilled 状态; 如果所有参数实例都变成 rejected 状态, 包装实例就会变成 rejected 状态.
IV.Promise.resolve()
有时需要将现有对象转为 Promise 对象, Promise.resolve()方法就起到这个作用.
const jsPromise = Promise.resolve($.Ajax('/whatever.json'));
resolve 的参数类型
(1). 参数是一个 Promise 实例, 原封不动地返回这个实例
(2). 参数是一个 thenable 对象
Promise.resolve 方法会将这个对象转为 Promise 对象, 然后就立即执行 thenable 对象的 then 方法.
- let thenable = {
- then: function(resolve, reject) {
- resolve(42);
- }
- };
- let p1 = Promise.resolve(thenable);
- p1.then(function(value) {
- console.log(value); // 42
- });
(3). 参数不是具有 then 方法的对象, 或根本就不是对象
如果参数是一个原始值, 或者是一个不具有 then 方法的对象, 则 Promise.resolve 方法返回一个新的 Promise 对象, 状态为 resolved.
V.Promise.reject()
Promise.reject(reason)方法也会返回一个新的 Promise 实例, 该实例的状态为 rejected.
此时, 不管 reason 是什么类型, 参数 reason 会原封不动地变成后续方法的参数.
来源: http://www.jianshu.com/p/33e039437ab1