执行过程_Promise详细执行过程介绍

f89a76ebb2424b6b872d1e2bd9e9877b.gif

前言

平时工作中我们都在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都已经fulfilledrejected后的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

9d48e8a00fedc5e8de62b6c3710c4b31.png

关注哦!优质原创文章在这里等你哦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值