前言:js是单线程的语言,所以很多操作都是异步操作,而异步操作多由回调函数完成,这里边就会引出一个现象”回调地狱“即回调函数中有回调函数,这种现象会导致代码的可读性降低,为了解决这种问题我们选择使用promise
定义:Promise 是异步操作的一种解决方案,其实是一个构造函数,自己身上有all、reject、resolve这几个方法,原型上有then、catch等方法。
promise作用:防止出现回调地狱,提高代码的可读性,像同步操作那样去操作异步操作
let pro = new Promise((resolve,reject) => {
if(Math.random() > 0.5){
resolve("i'm resolve");//成功返回
}else{
reject("i'm reject");//报错
}
})
pro.then((res) => {
console.log(res);
}).catch((err) => {
console.log(err);
})
原理:一个promise对象就代表一个一个异步操作,通过状态去管理异步操作
状态:
(1)pending:执行中
(2)fulfilled :完成,也就是执行了resolve()
(3)rejected:失败,reject()执行
上述代码块实现的是通过随机函数判断执行哪条指令的操作,各有一半的机率,如果返回的是resolve则执行的是then(),如果返回的是reject则执行的是catch()
function saodi(){
return new Promise((resolve,reject) => {
setTimeout(function() {
resolve("扫地完成")
}, Math.random() * 1000)
})
}
// 烧水
function shaoshui(){
return new Promise((resolve,reject) => {
setTimeout(function() {
resolve("烧水完成")
}, Math.random() * 1000)
})
}
//全部完成
Promise.all([saodi(),shaoshui()]).then(data => {
console.log(data);
})
// 只要有一个完成就可以
Promise.race([saodi(),shaoshui()]).then(data => {
console.log(data);
})
上述两个代码块中race表示的是只要有一个任务完成即可,而all表示需要全部完成才可以。上述两个代码块打印出来的结果分别如下面两图展示,all方法打印出来的是“扫地完成”和“烧水完成”两个事件,而race方法打印出的是任意一个事件,可能是“烧水成功”,也可能是“扫地成功”。