回调地狱
有俩定时器,最基本的异步
setTimeout(()=>{
console.log(1)
},2000)
setTimeout(()=>{
console.log(2)
},1000)
正常来看,我们得到的结果是2,1。试想我们想要输出1,2 我们可能会想到嵌套 e.g.
setTimeout(()=>{
console.log(1)
setTimeout(()=>{
console.log(2)
},1000)
},2000)
再多点 e.g.
setTimeout(() => {
console.log(1)
setTimeout(() => {
console.log(2)
setTimeout(() => {
console.log(2)
setTimeout(() => {
console.log(2)
setTimeout(() => {
console.log(2)
}, 1000);
}, 1000);
}, 1000);
}, 1000);
}, 2000);
像个大箭头一样的嵌套,极其不美观,也不好维护,这就是回调地狱。
既然有不足,就会有方法去解决它,我们可以用es6的promise来解决这个问题。
promise
一个构造函数,传递异步操作的消息,链式调用,避免层层嵌套。
a. 基本使用
- 在一个函数内部 返回 promise 对象
- promise 对象的内部也有回调 resolve reject
- 它有3种状态
- pending 进行中
- resolve 成功
- reject 失败
function fun1 (){
return new Promise((resolve,reject)=>{
// 异步处理
resolve('ok') //ok resolve 的数据 then可以接受
reject('nook') // no ok catch的数据对应的就是 reject的数据
})
}
fun1()
.then((data)=>{
})
.catch((err)=>{
})
b. 链式调用 , 可以有无数个.then但只能有一个.catch
fun1()
.then(()=>{
return fun2()
})
.then(()=>{
return fun3()
})
.then(()=>{
return fun4()
})
.catch(()=>{
})
链式调用中任何一个出现错误(reject() throw ) 终止执行 由 catch 捕获错误