目录
一、回调函数和回调地狱
1.什么是回调函数
2.同步异步
3.回调地狱
二、Promise对象
1.promise的三个状态
2、promise的.then方法和.catch方法
3.优缺点
当一个函数作为参数传入到另外一个函数,并且该函数不会立即执行;当满足某个条件时才执行该函数
function fn(){
console.log('callback')
}
setTimeout(fn,3000)
在上面这段代码里面setTimeout(fn,3000)fn作为参数传入到另外一个函数里面,在满足过3秒后执行。所以可以说fn是回调函数
同步任务:在主线程队列中,只有前一个任务完成后才会执行下一个任务
异步任务:不进入主线程队列,而是进入异步队列,前一个任务完成与否不影响后一个任务的执行(不阻塞后续任务执行的任务)
setTimeout(function (){
console.log('执行了回调函数')
},3000)
console.log(111)
// 111
// 执行了回调函数
如果按照代码编写的顺序,应该先输出“执行了回调函数”,再输出“111”。但实际输出为并不是。这种不阻塞后面任务执行的任务就叫做异步任务。
如果按照代码编写的顺序,应该先输出“执行了回调函数”,再输出“111”。但实际输出为并不是。这种不阻塞后面任务执行的任务就叫做异步任务。
setTimeout(function(){
console.log('日日复月月');
setTimeout(function(){
console.log('月月复年年');
setTimeout(function(){
console.log('年年复此生')
},1000)
},2000)
},3000)
// 日日复月月
// 月月复年年
// 年年复此生
这种回调函数中嵌套回调函数的情况就叫做回调地狱。回调地狱就是为是实现代码顺序执行而出现的一种操作
(1)代码的可读性差、可维护性差
(2)代码的扩展性差
Promise是一个原生的JavaScript对象,是一种异步编程的解决方案,通过一个回调,避免更多的回调
pending(初始状态、等待中)、resolved(已经成功)、rejected(已失败)。以Ajax为例:pending,就是异步还未返回结果,正在进行或者等待中,等待服务端返回结果。resolved,就是Ajax成功,rejected就是Ajax失败
都是是promise返回结果之后被执行的回调函数。.then接收resolved传递过来的信息;.catch接收rejected传递过来的信息
function fn(str){ //str='日日复月月'
//创建Promise对象
let p = new Promise(function(resolve,reject){
let flag = true;
setTimeout(function(){ //模拟异步调用
if(flag){ //模拟异步调用成功
resolve(str) //将str通过resolve传递出去 ---- resolve('日日复月月')
}else{ //模拟异步调用失败
reject("操作失败") //将失败的信息通过reject传递出去
}
})
})
return p;
}
fn('日日复月月').then((data)=>{ //.then接收resolve(str)传回来的信息
console.log(data); //data=('日日复月月')
return fn('月月复年年');
}).then((data)=>{
console.log(data); //data=('月月复年年')
return fn('年年复此生')
}).then((data)=>{
console.log(data) //data=('年年复此生')
}).catch((err)=>{
console.log(err)
})
// 日日复月月
// 月月复年年
// 年年复此生
优点:
(1)对象的状态不受外界影响,promise对象的三种状态。只有异步操作的结果。可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。
(2)一旦状态改变,就不会再改变,任何时候都可以得到这个结果。他的状态改变只有两种可能从pending变成resolved和从pending变成rejected。只要这两种情况发生。状态就凝固了,不会再变了,会一直保持这个结果。
缺点:
(1)无法取消promise。一旦建立就会李继执行,无法中途取消。
(2)如果不设置回调函数,promise内部抛出的作物,不会反应到外部。
(3)当处于pending状态时,无法得知目前进展到那一个阶段