ES6中的异步对象Promise

回忆一下ES5中的怎么使用异步方法


// es5中的异步回调
    let ajax = function(callback){
      console.log('执行')    // 执行
      setTimeout(() => {
        callback&&callback.call();
      }, 1000)
    };

    ajax(function(){
      console.log('hello') // 1s后打印hello
    });

使用ES6的Promise的方法:

 
let ajax = function(){
      console.log('执行2'); // 执行2
      return new Promise((resolve,reject)=>{
        setTimeout(() => {
          resolve()  // 执行下一步操作, reject   // 中断当前的操作
        },5000)
      })
    }

    ajax().then(()=>{
      console.log('promise','timeout2')   // 5s后打印   promise timeout2
    })

连续使用Promise对象:


let ajax = function(){
      console.log('执行3');
      return new Promise((resolve,reject)=>{
        setTimeout(() => {
          resolve();
        },5000)
      })
    }

    ajax().then(function(){
      return new Promise(function(resolve,reject){
        setTimeout(() => {
          resolve()
        }, 2000)
      })
    }).then(function(){
      console.log('timeouk3')  // 7s后打印timeouk3
    })


Promise捕获错误的catch( )


     // catch 捕获错误
    let ajax = function(num){
      console.log('执行4');
      return new Promise(function(resolve,reject){
        if(num>=5){
          resolve();
        }else{
          throw new Error('传入的数字比5小')
        }
      })
    }


    ajax(4).then(function(){
      console.log('log',4);  
    }).catch(function(err){
      console.log('catch',err);  // catch Error: 传入的数字比5小
    })

Promise的两种高级用法

1.Promise.all( )


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){  
      console.log(imgs);
      imgs.forEach(function(img){
        document.body.appendChild(img);
      })
    }

    // promise.all()的用法
    Promise.all([
      loadImg('http://yanshi.sucaihuo.com/modals/0/23/small.jpg'),
      loadImg('http://yanshi.sucaihuo.com/modals/0/20/small.jpg'),
      loadImg('http://yanshi.sucaihuo.com/modals/0/2/small.jpg')
    ]).then(showImgs)


    /**解析: 
      把多个promise实例当做一个promise实例,当所有的promise实例发生变化后
      新的promise实例才会发生变化
    */ 

2.Promise.race( )


// 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(img){
      let p = document.createElement('p');
      p.appendChild(img);
      document.body.appendChild(p);
    }

   // promise.race()的用法 只要有一个网速好的加载完,其他的就不加载了
    Promise.race([
      loadImg('http://yanshi.sucaihuo.com/modals/0/23/small.jpg'),
      loadImg('http://yanshi.sucaihuo.com/modals/0/20/small.jpg'),
      loadImg('http://yanshi.sucaihuo.com/modals/0/2/small.jpg')
    ]).then(showImgs)
  }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值