Promise对象

目录

一、回调函数和回调地狱

1.什么是回调函数

2.同步异步

3.回调地狱

二、Promise对象

1.promise的三个状态

2、promise的.then方法和.catch方法

3.优缺点


一、回调函数和回调地狱

1.什么是回调函数

当一个函数作为参数传入到另外一个函数,并且该函数不会立即执行;当满足某个条件时才执行该函数

function fn(){
    console.log('callback')
}
setTimeout(fn,3000)

在上面这段代码里面setTimeout(fn,3000)fn作为参数传入到另外一个函数里面,在满足过3秒后执行。所以可以说fn是回调函数

2.同步异步

同步任务:在主线程队列中,只有前一个任务完成后才会执行下一个任务

异步任务:不进入主线程队列,而是进入异步队列,前一个任务完成与否不影响后一个任务的执行(不阻塞后续任务执行的任务)

setTimeout(function (){
    console.log('执行了回调函数')
},3000)
console.log(111)
 
//    111
//    执行了回调函数

如果按照代码编写的顺序,应该先输出“执行了回调函数”,再输出“111”。但实际输出为并不是。这种不阻塞后面任务执行的任务就叫做异步任务。

3.回调地狱

如果按照代码编写的顺序,应该先输出“执行了回调函数”,再输出“111”。但实际输出为并不是。这种不阻塞后面任务执行的任务就叫做异步任务。

setTimeout(function(){
    console.log('日日复月月');
    setTimeout(function(){
        console.log('月月复年年');
        setTimeout(function(){
            console.log('年年复此生')
        },1000)
    },2000)
},3000)
 
//    日日复月月
//    月月复年年
//    年年复此生

这种回调函数中嵌套回调函数的情况就叫做回调地狱。回调地狱就是为是实现代码顺序执行而出现的一种操作

(1)代码的可读性差、可维护性差

(2)代码的扩展性差

二、Promise对象

Promise是一个原生的JavaScript对象,是一种异步编程的解决方案,通过一个回调,避免更多的回调

1.promise的三个状态

pending(初始状态、等待中)、resolved(已经成功)、rejected(已失败)。以Ajax为例:pending,就是异步还未返回结果,正在进行或者等待中,等待服务端返回结果。resolved,就是Ajax成功,rejected就是Ajax失败

2、promise的.then方法和.catch方法

都是是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)
})
 
//    日日复月月
//    月月复年年
//    年年复此生

3.优缺点

优点:

(1)对象的状态不受外界影响,promise对象的三种状态。只有异步操作的结果。可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。

(2)一旦状态改变,就不会再改变,任何时候都可以得到这个结果。他的状态改变只有两种可能从pending变成resolved和从pending变成rejected。只要这两种情况发生。状态就凝固了,不会再变了,会一直保持这个结果。

缺点:

(1)无法取消promise。一旦建立就会李继执行,无法中途取消。

(2)如果不设置回调函数,promise内部抛出的作物,不会反应到外部。

(3)当处于pending状态时,无法得知目前进展到那一个阶段

你可能感兴趣的:(javascript,前端,开发语言)