您现在的位置:首页 >> 前端 >> 内容

ES6中的异步对象Promise方法使用介绍

时间:2018/3/21 11:30:41 点击:

  核心提示:回忆一下ES5中的怎么使用异步方法// es5中的异步回调let ajax = function(callback){console.log(执行)// 执行setTimeout(() = {call...

回忆一下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('https://yanshi.sucaihuo.com/modals/0/23/small.jpg'),
      loadImg('https://yanshi.sucaihuo.com/modals/0/20/small.jpg'),
      loadImg('https://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('https://yanshi.sucaihuo.com/modals/0/23/small.jpg'),
      loadImg('https://yanshi.sucaihuo.com/modals/0/20/small.jpg'),
      loadImg('https://yanshi.sucaihuo.com/modals/0/2/small.jpg')
    ]).then(showImgs)
  }

Tags:ES S6 6中 中的 
作者:网络 来源:前端小贤