Promise
对象的状态改变,只有两种可能:从 pending
变为 fulfilled
和从 pending
变为 rejected
。如果改变已经发生了,你再对 Promise
对象添加回调函数,会立即得到这个结果。这与事件完全不同,事件的特点是,如果你错过了它,再去监听,是得不到结果的。
如果不设置回调函数,Promise
内部抛出的错误,不会反应到外部
promise
内部嵌套
const p1 = new Promise(function (resolve, reject) {
setTimeout(() => reject(new Error('fail')), 3000)
})
// resolve(p1) 将导致 p2.then 转接到p1上
const p2 = new Promise(function (resolve, reject) {
setTimeout(() => resolve(p1), 1000)
})
p2
.then(result => console.log(result))
.catch(error => console.log(error))
// Error: fail
then
方法嵌套
const p1 = new Promise(function (resolve, reject) {
setTimeout(() => resolve('p1'), 3000)
})
const p2 = new Promise(function (resolve, reject) {
setTimeout(() => resolve('p2'), 1000)
})
p2.then((data) => {
console.log('p2.then');
console.log('data: ' + data);
return p1;
}).then((data) => {
console.log('p2.then.then');
console.log('data: ' + data);
})
new Promise((resolve, reject) => {
resolve(1);
console.log(2);
}).then(r => {
console.log(r);
});
// 2
// 1
Promise.all
将多个子Promise
实例包装成一个新的Promise
实例,只有所有子实例状态都变成fulfilled
时,新实例才会变成fulfilled
,否则任何一个子实例状态变成rejected
新实例就会变成rejected
Promise.any
将多个子Promise
实例包装成一个新的Promise
实例,只有所有子实例状态都变成rejected
时,新实例才会变成rejected
,否则任何一个子实例状态变成fulfilled
新实例就会变成fulfilled
,该方法处于 提案 阶段Promise.race
将多个子Promise
实例包装成一个新的Promise
实例,只要子实例任何一个发生状态改变,新实例就会跟着发生同样的状态改变Promise.allSettled
将多个子Promise
实例包装成一个新的Promise
实例,只有所有子实例都发生状态改变,新实例才会结束,结束状态总是fulfilled
,该方法由 ES2020 引入