ES6——Promise

简介

Promise是解决异步编程的一种解决方案。


什么是异步?


已有函数A,A去执行一个步骤,A执行完,再执行B。

A -> B

这么一个过程就是异步。


如何异步编程?


第一种:回调函数

第二种:事件触发

而,Promise有别于以上两种。



回调 && Promise



回调


语法

定义
    A = function(B){
    A函数部分;

    B函数部分;
    } 
调用
    A(自定义)


实例

模拟ajax一秒钟通信

let ajax = function(callback){
    console.log('执行');

    //一秒后执行
    setTimeout(function(){
        callback && callback.call()
    },1000)
};

ajax(function(){
    console.log('timeout1');  
})


运行结果


先打印出 执行

一秒后打印 timeout1




Promise


语法

new Promise(function(resolve,reject))


补充说明


resolve执行当前操作,reject中断当前操作,这两个参数也是函数。

Promise实例具有then方法,意思是执行下一步

实例

模拟ajax一秒钟通信

let ajax = function(){
    console.log('执行2');

    //resolve执行当前操作,reject中断当前操作
    return new Promise(function(resolve,reject){
        setTimeout(function(){
            resolve()
        },1000)
    })
};

//执行
//上面提到ajax会返回一个实例对象,这个实例对象具有then方法——执行下一步
           // ↓↓这里的function就是resolve
ajax().then(function(){                                
    console.log('timeout2');
 // ↓↓这里的function就是reject   
},function(){})


运行结果


先打印出 执行2

一秒后打印 timeout2



Promise基本用法



多步


和上面一样,ajax()结束过后,继续返回一个Promise对象,使用then即可。

实例

    //多步
    //第一步
    let ajax = function(){
        console.log('执行3');
        //resolve执行当前操作,reject中断当前操作
        return new Promise(function(resolve,reject){
            setTimeout(function(){
                resolve()
            },1000)
        })
    };

    //第二步
    //ajax继续返回一个Promise实例对象,ajax完了以后,继续使用then
    ajax()
        .then(function(){
        console.log('timeout-1');
        return new Promise(function(resolve,reject){
            setTimeout(function(){
                resolve()
            },2000)
        });
    })
        //第三步
        .then(function(){
        console.log('timeout-2');
    })


运行结果


先打印出 执行2

一秒后打印 timeout-1

再过一秒后打印 timeout-2



错误捕获

使用catch关键字


实例
let ajax = function(num){
        console.log('执行4');
        return new Promise(function(resolve,reject){
            //判断
            if(num>5){
                resolve()
            }
            else{
                throw new Error('出错了')
            }
        })
    }
    //调用
    ajax(3).then(function(){
        console.log('log',3);
    })
        //捕获错误
        .catch(function(err){
        console.log('catch',err);
    });


运行结果


先是打印出错了,

后面跟着 错误信息



Promise高级用法



Promise.all()

所有promise状态发生改变了,才进行下一步。

参数是数组!!!


实例
//所有图片状态发生改变了(不一定加载成功,但状态已经变了),再添加到页面
    //加载图片主程序
    function loadImg(src){
        return new Promise((resolve,reject)=>{
            let img = document.createElement('img');
            img.src = src;

            //图片加载
            img.onload=function(){
                resolve(img);
            }
            //抛出错误,并停止
            img.onerror=function(err){
                reject(err);
            }
        })
    }

    //显示图片(添加到页面)
    function showImgs(imgs){
        imgs.forEach(function(img){
            document.body.appendChild(img);
        })
    }

    //all()把多个promise实例合并为一个
    Promise.all([
    loadImg('xxx.jpg'),
    loadImg('xxx2.jpg'),
    loadImg('xxx3.jpg'),
    ]).then(showImgs)



Promise.race()

和all相反,有一个状态发生改变就行,只执行一项。

//哪张图片先加载完,就显示到页面

 Promise.race([
    loadImg('xxx.jpg'),
    loadImg('xxx2.jpg'),
    loadImg('xxx3.jpg'),
    ]).then(showImgs)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值