异步方法之promise

  • Post author:
  • Post category:其他



1.promise是一个构造函数,下面我们来看一下基础使用

//因为是个构造函数肯定是new方法使用
        const pro=new Promise(function(resolve,reject){
            //new出来的对象里面一般存放异步任务
            //这里是模拟ajax向服务器请求数据
            setTimeout(function(){
                let data='从数据库得到数据'
                resolve(data)//返回数据成功
            },1000)
        })
        console.log(pro);

产看后台打印,我们看三个重要的点,一个是then方法,还有PromiseStatus,PromiseValue


PromiseStatus的几种状态:

pending初始化、fulfilled成功、rejected(未决定,履行,拒绝),同一时间只能存在一种状态,且状态一旦改变就不能再变。promise是一个构造函数,promise对象代表一项有两种可能结果(成功或失败)的任务,它还持有多个回调,出现不同结果时分别发出相应回调。

PromiseStatus:resolved是我们new构造函数里的回调里的第一个参数,这里的参数是函数,表示成功时调用,第二个参数表示失败时调用,PromiseValue里面则是成功返回的数据


2.我们来看一下then方法的作用是什么,简单来说它就是一个回调函数,对成功和失败的结果做一个处理,成功的处理是then中的第一个处理函数,参数是value,失败的结果是第二个处理函数,参数是reason

const pro=new Promise(function(resolve,reject){
            setTimeout(function(){
                let data='从数据库得到数据'
                resolve(data)
            },1000)
        })
        //then里面有两个函数参数,第一个表示成功时调用,第二个表示失败时调用
        pro.then(function(value){ 
            //先来打印一下回调里的参数
            console.log(value);
        },function(reason){

        })

value的值就是promise对象中异步返回执行resolve成功函数回调的返回值

3.

接着我们看一下失败的返回值,这次就得用失败的回调函数了

 const pro=new Promise(function(resolve,reject){
            setTimeout(function(){
                /* let data='从数据库得到数据' */
                /* resolve(data) */
                let data='数据读取失败'
                reject(data)
            },1000)
        })
        //then里面有两个函数参数,第一个表示成功时调用,第二个表示失败时调用
        pro.then(function(value){ 
            //先来打印一下回调里的参数
            console.log(value);
        },function(reason){
            console.log(reason);
        })

来看下失败回调的打印结果


4.接下来我们来看pro对象调用了then方法之后返回个什么东西

const pro=new Promise(function(resolve,reject){
            setTimeout(function(){
                let data='从数据库得到数据' 
                resolve(data) 
            },1000) 
        })
        //将pro.then方法的调用返回值赋值给pro1
        pro1=pro.then(function(value){ 
            console.log(value);
        },function(reason){
            console.log(reason);
        })
        console.log(pro1);
        //判断返回类型
        console.log(typeof pro1);

这边看一下浏览器打印结果

这里注意一点,先执行了pro.then后面的打印语句,这是因为promise是异步方法,先执行后面的函数语句,再执行promise里面的异步任务。还有这里的Promisestatus的值是由回调函数的返回结果来决定的,这一点我们去下面看,什么叫返回结果,也就是return的结果

这个then方法调用,竟然重新返回了一个promise对象,这玩意的原型竟然还是promise,这说明了什么?这说明这promise还能重复调用。


5.我们接下来看看它是否能重复调用then方法

const pro=new Promise(function(resolve,reject){
            setTimeout(function(){
                let data='从数据库得到数据' 
                resolve(data) 
            },1000) 
        })
        //为了代码简洁我们用箭头函数,并且去掉失败的结果,来看重复调用
        pro.then(value=>{ 
            console.log(value);
            return new Promise((resolve,reject)=>{
                setTimeout(function(){
                resolve('ok') 
            },1000)    
        })
        }).then(value=>{
            console.log(value);
        })
        console.log('我不是异步函数,我先执行');

pro1的返回值的promisestatus取决于,return 后面的的执行的任务是否成功,因为我用成功的回调函数回调了一个ok所有pro1的状态是成功,而promiseresult是返回值。

还有注意4中的结果没有返回值为什么promisestatus也是成功,因为没有返回值就是undefined,返回undefined也算返回值,是成功。


学到这你自己可以试一下将return中的回调函数换成失败的,再看pro1中的状态。



版权声明:本文为weixin_57282754原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。