1.介绍
之前的异步编程都是回调函数(数据库操作、ajax、定时器、fs读取文件 )
promise是es6异步编程新的解决方案,是一个构造函数
优点:支持链式调用,可以解决回调地狱,可以指定回调函数
2.使用
function getNum(num){return new Promise(()=>{if(num>10){resolve(true)}else{reject(false)})
}getNum().then.(val=>{console.log(val)},result=>{console.log(result)}
)
3.状态
pending
resolved/fulfilled
rejected
4.方法
4.1then方法
var promise = new Promise((resolve, reject) => {console.log("inner Promise"); // 1setTimeout(() => {resolve("Fashion Barry"); // 3}, 1000);
});promise.then((res) => {console.log("res", res);
});
console.log("outer promise"); // 2
// Promise 实际是一个同步函数,then 方法才是异步
// 所以输出顺序如上
4.2 resolve方法
传一个非promise对象的值会成功返回这个值
例如:var p = Promise.resolve('111')
console.log(p) //111
传一个promise对象
4.3 reject方法
无论传什么值都会失败 但是会输出该值
var p = Promise.reject('111')
const p1=Promise.reject(new Promise((resolve,reject)=>{resolve("ok")
}))
console.log(p,p1)
4.4all方法(promises=>{})
promises:包含n个promise的数组
返回一个新的promise,只有所有的promise都成功才成功,有一个失败就直接失败
1.全部为成功状态
2.有一个失败
4.5race方法promises=>{})
promises:包含n个promise的数组
返回一个新的promise,第一个完成的promise的结果状态就是最终的结果状态
5.改变promise状态
6.问题
6.1promise设置多个回调(如果状态改变 都会执行)
6.2promise状态和回调谁先执行
- 同步执行时 先改变状态后执行回调
- 执行函数中是一个异步任务时就先执行回调,再改变状态
6.3如何先改状态再执行回调
1.同步任务
2.延迟再调用then()
6.4返回结果
- 如果在成功的回调中throw一个错误 会使promise的状态变为失败
- 回调中返回的结果是非promise类型的对象,会返回该值,状态变为成功
- 回调中返回的结果是promise类型的对象,返回改promise对象的结果
6.5如何串联多个任务
6.6异常穿透
在最后去处理错误,中间出现了错误,也可以由最后的catch方法处理
6.7中断promise链
只有一个办法:返回一个pending状态的promise
return new Promise(()=>{})
7.async函数
返回结果是promise对象,返回状态由函数内部的return决定
8.await表达式
右侧的表达式一般为promise对象,也可以是其他值
- 如果表达式是promise对象,await返回的是promise成功的值
- 如果是其他值,直接将该值作为await的返回值
⚠️注意:
- await必须写在async函数中 但async函数中可以没有await
- 如果await右边的promise失败了会抛出异常,需要通过try...catch处理