promise的常用情况
常规用法
function pro(params) { return new Promise((resolve, reject) => { setTimeout(() => { if (params) { resolve(2222); } else { reject(1111); } }, 2000) }) } pro(false).then((res => { console.log(res) })).catch((aaa) => { console.log(aaa) })
执行顺序,实例化时立即执行
let promise = new Promise(function(resolve, reject) { console.log('Promise'); resolve(); }); promise.then(function() { console.log('resolved.'); }); console.log('Hi!');
当resolve参数是另一个promise的实例的时候会等待参数中的promis状态改变后才会执行
const p1 = new Promise(function (resolve, reject) { console.log(1) setTimeout(() => reject(new Error('fail')), 3000) }) const p2 = new Promise(function (resolve, reject) { console.log(2) resolve(p1) }) p2 .then(result => console.log(result)) .catch(error => console.log(error))
promise.all
let a = new Promise((resolve, reject) => { resolve(11) }) let b = new Promise((resolve, reject) => { resolve(22) }) let c = new Promise((resolve, reject) => { resolve(33) }) console.log(a) Promise.all([a, b, c]).then((res) => { console.log(res) }).catch(res => { console.log(res) }) //如果上边都是resolve则在then中的生效了,结果是一个数组形式 //[11,22,33] let a = new Promise((resolve, reject) => { resolve(11) }) let b = new Promise((resolve, reject) => { reject(22) }) let c = new Promise((resolve, reject) => { reject(33) }) Promise.all([a, b, c]).then((res) => { console.log(res) }).catch(res => { console.log(res) }) //如果上边其中一个不是resolve的话那then就不会执行,catch中获取到的是第一个reject的结果 //22
Promise.race()
只要p1、p2、p3之中有一个实例率先改变状态,p的状态就跟着改变。那个率先改变的 Promise 实例的返回值,就传递给p的回调函数
const p = Promise.race([ fetch('/resource-that-may-take-a-while'), new Promise(function (resolve, reject) { setTimeout(() => reject(new Error('request timeout')), 5000) }) ]); p .then(console.log) .catch(console.error);
使用场景:设置等待时长,如果请求或操作在一定时间内没有完成就返回reject状态来标识失败
Promise.allSettled()
let a = new Promise((resolve, reject) => { resolve(11) }) let b = new Promise((resolve, reject) => { reject(22) }) let c = new Promise((resolve, reject) => { resolve(33) }) Promise.allSettled([a, b, c]).then((res) => { console.log(res,1) }).catch(res => { console.log(res,2) }) [ { status: 'fulfilled', value: 11 }, { status: 'rejected', reason: 22 }, { status: 'fulfilled', value: 33 } ] 1
只有then中的打印生效了,而且输出的是一个对象形式,对象中包含了promise返回的状态