美文网首页
ES6异步方法

ES6异步方法

作者: 追逐_e6cf | 来源:发表于2018-09-18 00:19 被阅读0次

    一、函数的拓展
    函数传参与默认值
    ES6函数的默认值:(x = 6)
    默认值可以写表达式,表达式在函数执行阶段执行

    //传参方式一
    function foo(x = a + 6, y, z){
      console.log(x, y, z);
    }
    let a = 10;
    foo();
    
    //传参方式二
    function foo({x = 5, y = 6, z}){
      console.log(x, y, z);
    }
    foo({z:3, x:1});
    
    //传参方式三
    function foo(...arr){
      console.log(arguments);
      console.log(arr);
    }
    foo(1, 2);
    

    箭头函数

    let foo = a => a; //最基础的箭头函数
    //ES5函数的this指向是根据调用对象来绑定,this是执行时绑定
    //ES6箭头函数的this是定义时绑定,绑定的是当前作用域下的this
    
    foo(a){
      return a;
    }
    //多个或者零个参数用()
    //只有一个参数可以直接写参数名
    //...接受没有被变量接受的所有参数
    //this是定义时绑定的,无法改变
    let foo = (a, b, c, d, ...arr) => {
      console.log(this);
      console.log(a, b, c, d, arr);
    };
    foo.call([], 1, 2, 3, 4); //无法改变this指向
    
    let foo = a => a+1;
    console.log(foo(2));
    

    二、promise

    let img = new Image();
    img.src = "";
    //图片加载完毕的时候执行
    img.onload = function(){
      document.body.appendChild(this);
      codeImg(this);
    }
    function codeImg(img){
      console.log(img.width);
    }
    

    实例化promise
    进行中 成功 失败
    rending fullfilled reject

    new Promise((resolve, reject)=>{
      let img = new Image();
      img.src = "";
      //加载完毕,执行成功的回调
      img.onload = resolve(img);
      //加载失败,执行失败的回调
      img.onerror = reject;
    
      setTimeout(()=>{
        if(true){
          //调用的是成功的回调,那么他的状态就是成功
          resolve();
        }else{
          //反之就是失败
          reject();
        }
      }, 3000);
    })
    //传参,可传两个回调 成功 失败
    .then((img)=>{
      console.log("成功");
    })
    //失败的时候回调
    .catch((err)=>{
      console.log(err);
    });
    

    三、promise例子

    new Promise((resolve, reject)=>{
      return resolve(6);  //可以用来中断代码的执行
    })
    .then((d)=>{
      console.log(d);
      //return 3;
      //等价于下面
      return new Promise((resolve)=>{
        resolve(3);
      });
    })
    .then((key)=>{
      console.log(key);
    })
    .then(()=>{
      console.log(1);
    })
    .catch((err)=>{
      console.log(err);
    })
    

    主动成功、主动失败

    //主动返回成功
    Promise.resolve(foo())
                  .then((d)=>{
                    console.log(d);
                  });
    //主动返回失败
    Promise.reject("失败")
                  .catch((err)=>{
                    console.log(err);
                  });
    

    Promise.all 必须是所有的Promise状态都是成功的(调用了resolve)才会执行all的then的成功回调

    //电影院推荐
    //不同的用户群体 推荐 不同的电影类型
    //获取用户是一个接口 获取电影是一个接口 推荐状态是一个接口
    
    //获取用户群体
    let p1 = new Promise((resolve)=>{
      console.log("开始请求用户数据");
      //code...后台去请求用户群体
      setTimeout((arr)=>{
        console.log("拿到用户数据了");
        resolve(arr);
      }, 1000, [1, 2, 3, 4, 5, 6]);
    });
    //获取电影集合
    let p2 = new Promise((resolve, reject)=>{
      console.log("开始请求电影集合");
      //code...后台去请求电影集合
      //setTimeout(resolve, 3000, [1000, 1001, 1002]);
      setTimeout((arr)=>{
        console.log("拿到电影集合了");
        resolve(arr);
        //reject("电影数据拿不到");
      }, 3000, [1000, 1001, 1002]);
    });
    

    all 接受一个数组,数组里面都是promise对象,如果不是,会被转化成promise

    Promise.all([p1,p2])
                  .then((arr)=>{
                    console.log(arr);
                  })
                  .catch((err)=>{
                    console.log(err);
                  })
    

    race 只要一个成功就可以了

    Promise.race([p1, p2)
                  .then(()=>{
                    console.log("某个请求已经成功");
                  })
    

    四、async函数
    Generator + Promise 的语法糖
    async函数 await关键字

    //在函数前面加上async关键字
    async function foo(){
      let img = await new Promise((resolve)=>{
        let newImg = new Image();
        newImg.src = "";
        newImg.onload = function(){
          resolve(this);
        };
        setTimeout(resolve, 3000, {
          width:665
        })
      });
    }
    

    相关文章

      网友评论

          本文标题:ES6异步方法

          本文链接:https://www.haomeiwen.com/subject/ydddnftx.html