1. 梗概:
1. 抛出/创建Promise以开始异步处理:
通过传递回调函数给Promise构造方法
2. 异步处理Promise对象:
通过await语法糖
child::await
2.1. 通过链式调用then()与cath()与finally()方法:
- child::Promise的then方法
- Promise中还有一个catch()方法, 向其传入回调函数可以处理失败的Promise, 如果传递链中任意Promise出现错误, 则会冒泡到最后的catch()方法中
- Promise中还有一个finally()方法, 想起传入回调函数可以进行首尾工作的执行
2. 创建Promise语法以开始异步处理:
new Promise(function(处理成功时调用的回调函数形参resolve,处理失败时调用的回调函数形参reject){
//异步处理
if(处理成功的条件){
/*调用成功函数*/
resolve(对应参数)//执行执行了resolve或reject函数,则该Promise状态发生变化
}
if(处理产生异常){
/*调用错误处理函数*/
reject(对应参数)
}
})
1. 说明:
- 需要传入一个回调函数给Promise构造函数, 其中要求这个回调函数有两个函数形参 ^f8c7eb
- 其中resolve形参是必须的,而reject形参是可选的
- child::reject与throw的区别
- 其中resolve形参是必须的,而reject形参是可选的
- 如果给resolve()传递一个Promise对象的参数, 则会等待该Promise的状态改变才会传递, 即先要等待依赖的Promise的状态更改后才能改变当前Promise的状态
- 执行resolve之后,还是会继续执行后面的代码
3. 处理Promise对象:
Promise对象
.then(处理成功的回调函数A,处理失败的回调函数B)
//该回调函数A就会传递给resolve形参,B就会传给reject形参
.then(回调函数A返回Promise对象的回调函数B)
.catch(以上任意一个Promise报错时的回调函数)//catch会捕获任何异常
.finally(无论成功与否,必定执行的回调函数)
1. 说明:
- then方法的
resolve回调函数
形参是必须的 - then方法的
reject回调函数
形参是可选的- 具体要看Promise中有没有需要
reject函数
- 具体要看Promise中有没有需要
.catch
等同于try catch
,会捕获promise中任何抛出的异常
判断Promise对象状态
推荐方法:
function decidePromiseState(promise) {
const t = {};
return Promise.race([promise, t])
.then(v => (v === t) ? PROMISE_STATE.PENDING : PROMISE_STATE.FULFILLED)
.catch(() => PROMISE_STATE.REJECTED)
}
原文
1. 更先进的语法糖:
1. child::async与await关键字
实例
之一
new Promise(resolve => {
console.log(1);
resolve(2);//后面还是会继续执行
setTimeout(() => {
Promise.resolve().then(() => console.log(7))
console.log(3);
}, 0)
Promise.resolve().then(() => console.log(4))
}).then(num => {
console.log(num)
});