前言
平时工作中我们都在Promise
,你真正了解它吗,今天一起详细看看它的执行过程。
定义
Promise
对象用于表示一个异步操作的最终完成 (或失败)及其结果值。
描述
一个Promise
对象代表一个在这个promise
被创建出来时不一定已知的值。它让您能够把异步操作最终的成功返回值或者失败原因和相应的处理程序关联起来。这样使得异步方法可以像同步方法那样返回值:异步方法并不会立即返回最终的值,而是会返回一个promise
,以便在未来某个时候把值交给使用者。
一、resolve
返回一个操作成功的Promise
对象。
let promiseResolve = new Promise((resFn, rejFn) => {
console.log('promise pending');
resFn('resolve value');
}).then(resVal => {
console.log(`result fulfilled: ${resVal}`);
}, rejVal => {
console.log(`result rejected: ${rejVal}`);
}).catch(err => {
console.log(`result catch: ${err}`);
}).finally(() => {
console.log(`result finally`);
});
promiseResolve;
// 输出结果
// promise pending
// result fulfilled: resolve value
// result finally
在确定操作成功时,简化如下:
Promise.resolve('resolve value').then(resVal => {
console.log(`result fulfilled: ${resVal}`);
}, undefined).catch(err => {
console.log(`result catch: ${err}`);
}).finally(() => {
console.log(`result finally`);
});
// 输出结果
// result fulfilled: resolve value
// result finally
二、reject
返回一个操作失败的Promise
对象。
let promiseReject = new Promise((resFn, rejFn) => {
console.log('promise pending');
rejFn('reject value');
}).then(resVal => {
console.log(`result fulfilled: ${resVal}`);
}, rejVal => {
console.log(`result rejected: ${rejVal}`);
}).catch(err => {
console.log(`result catch: ${err}`);
}).finally(() => {
console.log(`result finally`);
});
promiseReject;
// 输出结果
// promise pending
// result rejected: reject value
// result finally
在确定操作失败时,简化如下:
Promise.reject('reject value').then(undefined, rejVal=>{
console.log(`result rejected: ${rejVal}`);
}).catch(err=>{
console.log(`result catch: ${err}`);
}).finally(()=>{
console.log(`result finally`);
});
// 输出结果
// result rejected: reject value
// result finally
三、then
返回一个 Promise
。带有两个Promise
的成功、失败情况的回调函数。
1、then
接收到的全部是成功的回调函数。
let promiseMoreThenResolve = new Promise((resFn, rejFn) => {
console.log('promise pending');
resFn('0');
}).then(resVal => {
console.log(`result then: ${resVal}`);
return Promise.resolve('1');
}, rejVal => {
}).then(resVal => {
console.log(`result then: ${resVal}`);
return Promise.resolve('2');
}, rejVal => {
}).then(resVal => {
console.log(`result then: ${resVal}`);
return Promise.resolve('3');
}, rejVal => {
}).catch(err => {
console.log(`result catch: ${err}`);
}).finally(() => {
console.log(`result finally`);
});
promiseMoreThenResolve;
// 输出结果
// promise pending
// result then: 0
// result then: 1
// result then: 2
// result finally
2、then
接收带有失败(拒绝)的回调函数。
let promiseMoreThenReject = new Promise((resFn, rejFn) => {
console.log('promise pending');
resFn('0');
}).then(resVal => {
console.log(`result then: ${resVal}`);
return Promise.resolve('1');
}, rejVal => {
console.log(`result then: ${rejVal}`);
return Promise.reject('a');
}).then(resVal => {
console.log(`result then: ${resVal}`);
throw Error('error');
return Promise.resolve('2');
}, rejVal => {
console.log(`result then: ${rejVal}`);
return Promise.reject('b');
}).then(resVal => {
console.log(`result then: ${resVal}`);
return Promise.resolve('3');
}, rejVal => {
console.log(`result then: ${rejVal}`);
return Promise.reject('c');
}).catch(err => {
console.log(`result catch: ${err}`);
}).finally(() => {
console.log(`result finally`);
});
promiseMoreThenReject;
// 输出结果
// promise pending
// result then: 0
// result then: 1
// result then: Error: error
// result catch: c
// result finally
3、当有多个then
的时候,只需要处理接收成功的回调函数,异常放到catch
里捕获。那什么情况会用到多个then
,是在处理异步时,异步的请求顺序是串行,后面的异步依赖于前面异步的结果。
let promiseMoreThenReject = new Promise((resFn, rejFn) => {
console.log('promise pending');
resFn('0');
}).then(resVal => {
console.log(`result then: ${resVal}`);
return Promise.resolve('1');
}).then(resVal => {
console.log(`result then: ${resVal}`);
throw Error('error');
return Promise.resolve('2');
}).then(resVal => {
console.log(`result then: ${resVal}`);
return Promise.resolve('3');
}).catch(err => {
console.log(`result catch: ${err}`);
}).finally(() => {
console.log(`result finally`);
});
promiseMoreThenReject;
// 输出结果
// promise pending
// result then: 0
// result then: 1
// result then: Error: error
// result catch: c
// result finally
4、then
返回结果值。如果要用到then
的返回结果时,return
返回结果值,要优于Promise
对象。如果是同步行为都要在一个then
中处理。
let pAne = new Promise(resFn => {
console.log('1');
resFn('1');
}).then(resVal => {
console.log('2');
return Promise.resolve('2')
}).then(() => {
console.log('3');
});
let pTwo = new Promise(resFn => {
console.log('a');
resFn('a');
}).then(resVal => {
console.log('b');
return 'b'
}).then(() => {
console.log('c')
});
pAne;
pTwo;
// 输出结果
// 1 a 2 b c 3
四、all
这个方法返回一个新的Promise
对象,该Promise
对象在iterable参数对象里所有的Promise
对象都成功的时候才会触发成功,一旦有任何一个iterable
里面的Promise
对象失败则立即触发该Promise
对象的失败。
1、全部返回成功。
let mulPromiseOne = new Promise((resFn, rejFn) => {
resFn('one');
});
let mulPromiseTwo = new Promise((resFn, rejFn) => {
resFn('two')
});
let mulPromiseThree = new Promise((resFn, rejFn) => {
resFn('three')
});
Promise.all([mulPromiseOne, mulPromiseTwo, mulPromiseThree]).then(values => {
console.log(values);
}).catch(err => {
console.log(`result error: ${err}`);
}).finally(() => {
console.log(`result finally`)
});
// 输出结果
// ["one", "two", "three"]
// result finally
2、返回包含失败(拒绝)。
let mulPromiseOne = new Promise((resFn, rejFn) => {
setTimeout(() => resFn('one'), 3000);
});
let mulPromiseTwo = new Promise((resFn, rejFn) => {
setTimeout(() => rejFn('two'), 500);
});
let mulPromiseThree = new Promise((resFn, rejFn) => {
setTimeout(() => resFn('three'), 1000);
});
Promise.all([mulPromiseOne, mulPromiseTwo, mulPromiseThree]).then(values => {
console.log(values);
}).catch(err => {
console.log(`result error: ${err}`);
}).finally(() => {
console.log(`result finally`)
});
// 输出结果,在500ms返回结果信息。
// result error: two
// result finally
五、allSettled
返回一个在所有给定的promise
都已经fulfilled
或rejected
后的promise
,并带有一个对象数组,每个对象表示对应的promise
结果。
let mulPromiseOne = new Promise((resFn, rejFn) => {
setTimeout(() => resFn('one'), 3000);
});
let mulPromiseTwo = new Promise((resFn, rejFn) => {
setTimeout(() => rejFn('two'), 500);
});
let mulPromiseThree = new Promise((resFn, rejFn) => {
setTimeout(() => resFn('three'), 1000);
});
Promise.allSettled([mulPromiseOne, mulPromiseTwo, mulPromiseThree]).then(values => {
console.log(values);
}).catch(err => {
console.log(`result error: ${err}`);
}).finally(() => {
console.log(`result finally`)
});
// 输出结果,在3000ms返回结果信息。
// [
// {status: "fulfilled", value: "one"},
// {status: "rejected", value: "two"},
// {status: "fulfilled", value: "three"}
// ]
// result finally
六、any
接收一个Promise
可迭代对象,只要其中的一个promise
成功,就返回那个已经成功的promise
。
let mulPromiseOne = new Promise((resFn, rejFn) => {
setTimeout(() => resFn('one'), 3000);
});
let mulPromiseTwo = new Promise((resFn, rejFn) => {
setTimeout(() => rejFn('two'), 500);
});
let mulPromiseThree = new Promise((resFn, rejFn) => {
setTimeout(() => resFn('three'), 1000);
});
Promise.any([mulPromiseOne, mulPromiseTwo, mulPromiseThree]).then(values => {
console.log(values);
}).catch(err => {
console.log(`result error: ${err}`);
}).finally(() => {
console.log(`result finally`)
});
// 输出结果,在1000ms返回结果信息。
// three
// result finally
七、race
返回一个Promise
对象,一旦迭代器中的某个promise
解决或拒绝,返回的promise
就会解决或拒绝。
let mulPromiseOne = new Promise((resFn, rejFn) => {
setTimeout(() => resFn('one'), 3000);
});
let mulPromiseTwo = new Promise((resFn, rejFn) => {
setTimeout(() => rejFn('two'), 500);
});
let mulPromiseThree = new Promise((resFn, rejFn) => {
setTimeout(() => resFn('three'), 1000);
});
Promise.race([mulPromiseOne, mulPromiseTwo, mulPromiseThree]).then(values => {
console.log(values);
}).catch(err => {
console.log(`result error: ${err}`);
}).finally(() => {
console.log(`result finally`)
});
// 输出结果,在500ms返回结果信息。
// result error: two
// result finally
关注哦!优质原创文章在这里等你哦!