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会原封不动地变成后续方法的参数。