一.回调是什么
回调可以简单的理解为 你去商店买某个东西,店家告诉你卖完了,你留下电话让店家有货的时候通知你来买。回调就是这个原理
同步回调
立即执行,全部执行完了才算结束,比如数组遍历
const arr=[1,2,3]
arr.forEach(item=>{
console.log(item)
})
//foreach全部都执行完了才能执行下面的
console.log("forEach之后")
异步回调
异步回调函数,会放入队列中将来执行
setTimeout(()=>{
console.log("timeOut callback")
},0)
//先执行下面的代码 后执行setTimeout中的代码,即使时间是0
console.log("setTimeout()之后")
不会立即执行,放入回调队列中执行,比如定时器
二.回调地狱
回调地狱指的是多层回调嵌套下的代码,难以阅读,难以维护,比如下面这段代码:
setTimeout(()=>{
setTimeout(()=>{
setTimeout(()=>{
console.log("这是第三层")
},1000)
console.log("这是第二层")
},2000)
console.log("这是第一层")
},3000)
当这段代码嵌套到3层以上的时候,就很难阅读了
所以为了解决回调地狱这个问题,Promise出现了
三.Promise
Promise这个东西其实挺好理解,就像它的名字一样,承诺。它要得到一个结果,才会继续执行下边的操作,
从语法上来说:Promise是一个构造函数
从功能上来说,Promise对象是用来封装一个一步操作并可以获取其结果
一个promise对象的状态只能改变一次无论成功还是失败,都会有一个结果,成功就执行resolve()方法,失败就执行reject()方法
let promise = new Promise((resolve, reject) =>{//执行器函数
console.log("执行器函数是同步回调")
//执行异步任务
setTimeout(()=>{
const time=Data.now()
//如果成功
if(time%2==0){
resolve("成功了")
}else{
//如果失败
reject("失败了")
}
},1000)
});
promise.then(
value=>{
//onResolved()
console.log(value)
},
reason=>{
//onRejected()
console.log(reason)
}
)
Promise可以解决回调地狱,但因为它是链式调用,所以并不是最好的解决方法
doSomething().then(res=>{
return doSomethingElse(res)
}).then(res=>{
return doAnotherThing(res)
}).then(res=>{
console.log(res)
}).catch(err)
所以在promise的基础上,出现了async和await
async用于声明function是异步的,它返回的是一个Promise对象,而await是强制把异步变成了同步,这一句执行完毕才能执行下一句,而且只能用于async声明的方法内
async function request(){
try{
const res=await doSomething()
cosnt res2=await doSomethingElse()
const res3=await doAnotherThing()
}catch(err){
console.log(err)
}
}
reuqest().then(res=>{
console.log(res)
})
更多相关知识:https://segmentfault.com/a/1190000016788484