es6:常用命令(2)

1、 Set 和 Map数据构造

Set 数据构造

  • Set 相似数组,然则成员是唯一的,不存在反复值。
    Set自身是一个组织函数,用来天生Set数据构造。
    Set构造具有的属性:

       - Set.prototype.constructor:组织函数,默许是Set函数。
       - Set.prototype.size:返回Set的成员个数。
  • Set构造具有的要领

       - add(value):增加值;
       - delete(value):删除值
       - has(value):返回一个布尔值,
       - clear(): 清空一切成员
    举例:
        var s = new Set();
        
        //经由过程add要领向Set构造中加入成员
        [1,2,3,3,4].map(x => s.add(x))
        //Set构造不会增加反复值
        
        console.log(s) //{1,2,3,4}
        console.log(s.size)    //4
        console.log(s.has(1))  //true
        
        s.delete(2)            //删除某个值
        console.log(s.has(2))  //false 
        
        Array.from要领能够将Set构造转为数组。
        const arr1 = [1,2,3,4];
        const items = new Set(arr1);    //{1,2,3,4}
        const array = Array.from(items) //[1,2,3,4]
        
        Set数组去重的要领:
        function dedupe(array){
            return Array.from(new Set(array));
        } 
        dedupe([1,1,2,3])    //[1,2,3]

Map 数据构造

  • Map 相似对象,也是键值对的鸠合,然则”键”的局限不限于字符串,种种类型的值(包含对象)都能够看成键。
    Map自身也是组织函数,也能够接收一个数组作为参数
    Map实例具有的属性:

        - size属性:返回Map构造的成员总数
Map实例具有的要领:
     - set(key, value):设置键名key对应的键值value,然后返回全部Map构造,假如key已存在,则键值更新;
     - get(key):读取key对应的键值,假如找不到key,返回undefined;
     
     - has(key):返回一个布尔值;
     - delete(key):删除某个键,返回布尔值;
     - clear(): 消灭一切成员,没有返回值。
 举例:
     let map = new Map();
     map.set('name','liyong').set('age',10);
     
     console.log(map); //链式{"name" => "liyong","age"=>10}
     console.log(map.size);         // 2
     console.log(map.has("name"))   // true
     console.log(map.get("name"))   // "liyong"
     
     map.delete("name");            // 删除某个键
     console.log(map.has("name"))   // false
     console.log(map.get("name"))   // undefined
     console.log(map.size)          // 1
     
     map.clear();                   // 清空
     console.log(map.size)          // 0

2、 Promise 对象

Promise是一个组织函数,用来天生Promise实例,是异步编程的一种解决方案。
Promise组织函数接收一个函数作为参数,该函数的两个参数分别是函数resolve 和 rejected。
resolve函数作用是,异步操纵胜利后挪用,并将异步操纵效果作为参数通报出去;
reject函数的作用是,异步操纵失利时挪用,并将异步操纵效果作为参数通报出去。
Promise的基础用法:

//要领1
let promise = new Promise((resolve, reject)=>{
    if(success){
        resolve(data)
    }else{
        reject(err)
    }
})

//要领2
function promise (){
    return new Promise((resolve, reject)=>{
        if(success){
            resolve(a)
        }else{
            reject(err)
        }
    })
}
实例化的Promise对象会马上实行。

2.1 Promise.prototype.then()要领

Promise实例具有then要领,then要领是定义在原型对象Promise.prototype上的。then要领的第一个参数是resolved状况的回调函数,第二个参数(可选)是rejected状况的回调函数。
链式操纵的用法:

    //第一个函数runAsync1()
    function runAsync1(){
        let p = new Promise((resolve, reject)=>{
            setTimeout(()=>{
                resolve('第一个回调胜利')
            },1000)
        });
        return p;
    }
     //第二个函数runAsync2()
    function runAsync2(){
        let p = new Promise((resolve, reject)=>{
            setTimeout(()=>{
                reject('第二个回调失利')
            },2000)
        });
        return p;
    }
     //第三个函数runAsync3()
    function runAsync3(){
        let p = new Promise((resolve, reject)=>{
            setTimeout(()=>{
                reject('第三个回调胜利')
            },3000)
        });
        return p;
    }
    runAsync1()
    .then((data)=>{
        console.log(data);
        return runAsync2();
    },(error)=>{
        console.log(err);
        return runAsync2();
    })
    .then((data)=>{
        console.log(data);
        return runAsync3();
    },(error)=>{
        console.log(error);
        return runAsync3();
    }).then((data)=>{
        console.log(data)
    },(error)=>{
        console.log(error)
    })
    // 第一个回调胜利
    // 第二个回调失利
    // 第三个回调胜利

2.2 Promise.prototype.catch()要领

Promise.prototype.catch要领是.then(null,()=>{})的别号,用于指定发作错误时的回调函数。
举例:

用Promise对象完成Ajax操纵的例子
const getJSON = function(type,url){
    const promise = new Promise((resolve, reject)=>{
        const xhr = new XMLHttpRequest();
        xhr.onreadystatechange = handler;
        xhr.open(type,url,true);
        xhr.responseType = "json";
        xhr.setRequestHeader("Accept", "application/json");
        xhr.send();
        function handler(){
            if(this.readyState !== 4){
                return;
            }
            if(this.status == 200){
                resolve(this.response)
            }else{
                reject(new Error(this.statusText))
            }
        }
    });
    return promise;
}
//测试
getJSON("get","data/cartData.json")
    .then((response)=>{
        console.log(response)
    })
    .catch((error)=>{
        console.log(error)
    })
getJSON是对XMLHttpRequest 对象的封装,用于发出一个针对JSON数据的HTPP要求,而且返回一个Promise对象

2.3 Promise.prototype.all()要领

Promise的all用法供应并行实行异步操纵,而且在一切的异步操纵实行完成后实行回调。
运用场景:

一些游戏素材比较多的运用,翻开网页时,预先加载须要用到的种种资本,
一切的都加载完后,我们在举行页面的初始化。all要领的实际效果是,谁跑的慢就以谁为实行回调
举例:
照样上面的三个函数runAsync1()、runAsync2()、runAsync3()。
Promise
    .all([runAsync1(), runAsync2(), runAsync3()])
    .then((result)=>{
        console.log(result)
    })
    .catch((error)=>{
        console.log(error)
    })
    //第二个回调失利

2.4 Promise.prototype.race()要领

Promise.race要领同样是将多个Promise实例,包装成一个新的Promise实例。
用法:

 const p = Promise.race([p1,p2,p3]);    
上面代码中,只需p1、p2、p3当中的一个实例先转变状况,p的状况就随着转变。谁人先转变的Promise实例的返回值,就通报给p的回调函数。

举例:

//加载图片超时的处置惩罚
function request(url){
    let p = new Promise((resolve, reject)=>{
        let img = new Image();
        img.onload = resolve;
        img.src = url;
    });
    return p;
}
//耽误函数,用于给要求计时
function timeout(){
    let p = new Promise((resolve, reject)=>{
        setTimeout(()=>{
            reject('图片超时')
        },5000)
    });
    return p;
}
Promise
    .race([requestImg('../../img/1.1.jpg'), timeout()])
    .then((result)=>{
        console.log(result)
    })
    .catch((reason)=>{
        console.log(reason)
    })

《es6:常用命令(2)》

    原文作者:六块腹肌的长者
    原文地址: https://segmentfault.com/a/1190000013226329
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞