zoukankan      html  css  js  c++  java
  • ES6-----学习系列十四(promise)

    promise的出现主要是在异步操作中带来很大的便利

      es5中的传统ajax

    {
      // 基本定义
      let ajax=function(callback){
        console.log('执行');
        setTimeout(function () {
          callback&&callback.call()
        }, 1000);
      };
      ajax(function(){
        console.log('timeout1');
      })
    }

      通过promise来实现上面的情况

    {
      let ajax=function(){
        console.log('执行2');
        return new Promise(function(resolve,reject){//resolve是成功之后执行的方法   reject是失败的时候执行的方法
          setTimeout(function () {
            resolve()
          }, 1000);
        })
      };
    
      ajax().then(function(){//通过then来捕捉 成功和失败的时候执行的方法
        console.log('promise','timeout2');
      })
    } 
    {
      let ajax=function(){
        console.log('执行3');
        return new Promise(function(resolve,reject){
          setTimeout(function () {
            resolve()
          }, 1000);
        })
      };
    
      ajax()
        .then(function(){
        return new Promise(function(resolve,reject){
          setTimeout(function () {
            resolve()
          }, 2000);
        });
      })
        .then(function(){
        console.log('timeout3');
      })
    }

      出错捕获异常(通过catch捕获出错的信息)

    {
      let ajax=function(num){
        console.log('执行4');
        return new Promise(function(resolve,reject){
          if(num>5){
            resolve()
          }else{
            throw new Error('出错了')
          }
        })
      }
    
      ajax(6).then(function(){
        console.log('log',6);
      }).catch(function(err){
        console.log('catch',err);
      });
    
      ajax(3).then(function(){
        console.log('log',3);
      }).catch(function(err){
        console.log('catch',err);
      });
    }

      promise两种使用场景 (promise.all()当所有的promise实例都resolve之后 才会触发promise.all(),才会有then方法   promise.race()不同的是只要该数组中的 Promise 对象的状态发生变化(无论是 resolve 还是 reject)该方法都会返回)

    {
      // 所有图片加载完再添加到页面
      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);
        })
      }
    
      Promise.all([
        loadImg('http://i4.buimg.com/567571/df1ef0720bea6832.png'),
        loadImg('http://i4.buimg.com/567751/2b07ee25b08930ba.png'),
        loadImg('http://i2.muimg.com/567751/5eb8190d6b2a1c9c.png')
      ]).then(showImgs)
    
    }
    {
      // 有一个图片加载完就添加到页面
      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([
        loadImg('http://i4.buimg.com/567571/df1ef0720bea6832.png'),
        loadImg('http://i4.buimg.com/567751/2b07ee25b08930ba.png'),
        loadImg('http://i2.muimg.com/567751/5eb8190d6b2a1c9c.png')
      ]).then(showImgs)
    
    }
  • 相关阅读:
    Laravel 服务容器、服务提供器、契约实例讲解
    通过event记录sql
    laravel log改为时间格式
    array_column函数
    linux 安装ssh以及ssh用法与免密登录
    scp复制文件到远程服务器上
    nginx配置ssl证书后无法访问https
    Mac 在terminal 上用命令打开sublime
    Mac上通过iterm 上传文件到服务器
    基于visual Studio2013解决算法导论之044最短路径
  • 原文地址:https://www.cnblogs.com/diasa-fly/p/7017630.html
Copyright © 2011-2022 走看看