关闭

jses6语法:Iterator遍历器 promise async函数

时间: 2020-10-02阅读: 174标签: es6

一, Iterator遍历器

他是一种接口,为不同的数据结构体用统一的访问机制

var a = makeIterator([‘a‘, ‘b‘]);

console.log(a.next());  // a  false
console.log(a.next());  // b false
console.log(a.next());  // undefined true

function makeIterator(array) {
    var nextIndex = 0;
    return {
        next: function () {
            return nextIndex < array.length ? { value: array[nextIndex++], done: false }
                : { value: undefined, done: true }
        }
    }
}


1, 默认接口

接口部署在数据结构的Symbol.Iterator属性,或者说一个数据结构只要具备Symbol.Iterator属性就认为是可以遍历的

var obj = {
    [Symbol.Iterator]: function () {
        return {
            next: function () {
                return {
                    value: 1,
                    done: true,
                }
            }
        }
    }
}

var a = obj[Symbol.Iterator]().next()
console.log(a);  

// 数组有默认的[Symbol.Iterator]
let arr = [‘a‘,‘b‘,‘c‘];
let ter = arr[Symbol.iterator]();

console.log(ter.next());
console.log(ter.next());
console.log(ter.next());
console.log(ter.next());


二, Promise

异步编程的解决方案

已完成 fulfilled 进行中 pending 失败 rejected


1, 基本语法

Promise就是一个构造函数,可以生成实列

var per = new Promise(function(resolve,reject){

    if(true){
        resolve // 数据
    }else{
        reject // 错误信息
    }
});

// 实列生成以后  可以用then方法处理resolve状态和reject状态
per.then(function(value){
    // success
},function(error){
    // error
})


2, Promise会立即执行

let per = new Promise(function(resolve, reject){
    console.log(‘立即执行‘); // 1
    resolve();
})

per.then(function(){
    console.log(‘resolved‘); // 3
})
console.log(‘hello‘); // 2


3, 请求数据

// 1、实列化一个对象
function getjson(url) {
    var per = new Promise(function (resolve, reject) {
        // 请求数据的ajax
        var ajax = new XMLHttpRequest();
        ajax.open(‘get‘, url);
        ajax.send();
        // 监听
        ajax.onreadystatechange = function () {
            if (ajax.readyState === 4) {
                if (ajax.status === 200) {
                    resolve(ajax.responseText);
                } else {
                    reject(new Error(ajax.status));
                }
            }
        }
    })
    return per;
}

var a = getjson(‘./data/banner.json‘)
console.log(a);

getJson(‘./data/banner.json‘).then(function(json){
    console.log(json);
},function(text){
    console.log(text);
})


4, then

getJson(‘./data/banner.json‘).then(function(json){
   console.log(json);
},function(text){
   console.log(text);
})


5, 链式写法

getJson(‘./data/banner.json‘)
.then(function (json) {
    return getJson(‘./data/1.txt‘);
})
.then(function(){
    console.log(‘我的‘);
},function(){
    console.log(‘你的‘);
})


6, catch

用于指定发生错误时的回调函数

getJson(‘./data/banner.json‘).then(function (post) {
    console.log(post);
}).catch(function (error) {
    console.log(‘错误:‘, error);
})


7, all

将多个Promise实列包装成一个新的Promise实列

const p = Promise.all([p1,p2,p3]);
//这个方法接受一个数组作为参数,p1,p2,p3都是Promise实列

const per = [1, 2, 3].map(function (item) {
    return getJson(‘./data/‘ + item + ‘.txt‘); // ‘./data/1.json‘
})

Promise.all(per).then(function (post) {
    console.log(post);
}).catch(function (reason) {
    console.log(reason);
})


8, race

将多个Promise实列包装成一个新的Promise实列

const p = Promise.race([p1,p2,p3]);

const p = Promise.race([
    getJson(‘./data/banner1.json‘),
    new Promise(function (resolve, reject) {
        setTimeout(() => reject(new Error(‘错误‘)), 2000)
    })
])
p.then(console.log(‘1‘))
    .catch(console.error);


三, async函数

他是Generator函数语法糖,让异步更简单

function*a(){
    yield 1;
}
var n = a();
n.next();


1, 改成async函数,就是用async把星号替换掉,用await把yield替换掉

async function a(){
    var h = await 1;
    console.log(h);
}
a();

这个函数返回的是Promise对象,就可以使用then添加回调。


2, await

正常的情况下await后面是一个Promise对象,返回该对象的结果,如果不是Promise对象,返回的是这个值

async function f(){
    return await 123;
}
f().then(v=>console.log(v))


3, 错误处理

也就是 async 出错,Promise处于reject状态

async function f() {
    await new Promise(function (resolve, reject) {
        throw new Error(‘出错了‘);
    })
}
f().then(v => console.log(v))
.catch(e => console.log(e));
站长推荐

1.云服务推荐: 国内主流云服务商,各类云产品的最新活动,优惠券领取。地址:阿里云腾讯云华为云

2.广告联盟: 整理了目前主流的广告联盟平台,如果你有流量,可以作为参考选择适合你的平台点击进入

链接: http://www.fly63.com/article/detial/9806

关闭

ES6中export default 与export区别

export与export default均可用于导出常量、函数、文件、模块等,有什么区别呢?在一个文件或模块中,export、import可以有多个,export default仅有一个

Js ES6代理的实际用例

元编程是一种强大的技术,使你能够编写可以创建其他程序的程序。ES6借助代理和许多类似功能,使在JavaScript中利用元编程变得更加容易。ES6 Proxy(代理) 有助于重新定义对象的基本操作,从而为各种可能性打开了大门。

ES6 Promise用法详解

Promise是一个构造函数,接受一个参数(Function),并且该参数接受两个参数resolve和reject(分别表示异步操作执行成功后的回调函数、执行失败后的回调函数)

ES6新特性:JavaScript中Set和WeakSet类型的数据结构

ES6提供了新的数据结构Set,Set对象不是数组, 可以用来保存对象或者基本类型, 所有保存的值都是唯一的, chrome浏览器>38和FF>13,以及nodeJS,对Set支持良好, 以下的一些代码,都可以拷贝到控制台直接运行哦;

ES6迭代器精炼讲解

Iterator 是 ES6 引入的一种新的遍历机制,迭代器有两个核心概念:迭代器是一个统一的接口,它的作用是使各种数据结构可被便捷的访问,它是通过一个键为Symbol.iterator 的方法来实现。

ES6箭头函数(Arrow Functions)

箭头函数中的 this 指向的是定义时的对象,而不是使用时的对象;由于 箭头函数没有自己的this指针,通过 call() 或 apply() 方法调用一个函数时,只能传递参数,他们的第一个参数会被忽略

ES6 Decorator_js中的装饰器函数

ES6装饰器(Decorator)是一个函数,用来修改类的行为 在设计阶段可以对类和属性进行注释和修改。从本质上上讲,装饰器的最大作用是修改预定义好的逻辑,或者给各种结构添加一些元数据。

使用ES6让你的React代码提升到一个新档次

ES6使您的代码更具表现力和可读性。而且它与React完美配合!现在您已了解更多基础知识:现在是时候将你的ES6技能提升到一个新的水平!嵌套props解构、 传下所有props、props解构、作为参数的函数、列表解构

ES6的7个实用技巧

ES6的7个实用技巧包括:1交换元素,2 调试,3 单条语句,4 数组拼接,5 制作副本,6 命名参数,7 Async/Await结合数组解构

es6 Reflect对象

Reflect是ES6为操作对象而提供的新API,而这个API设计的目的只要有:将Object对象的一些属于语言内部的方法放到Reflect对象上,从Reflect上能拿到语言内部的方法。如:Object.defineProperty,修改某些object方法返回的结果。让Object的操作都变成函数行为。

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!