JavaScript中ES6新特性-Generator异步方案

Posted 萌萌的DDD

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaScript中ES6新特性-Generator异步方案相关的知识,希望对你有一定的参考价值。

Es2015提供的Generator --- 生成器函数

语法:在普通的函数基础之上多了一个*号

当调用这个函数并不会立即执行,而是生成一个生成器对象。

function* foo() {
    console.log('strat');

    // 通过 yield 关键词返回一个值
    yield 'foo'
}

const generator = foo()

// 并不会直接执行  而是生成一个生成器对象
console.log(generator); // Object [Generator] {}

// 直到调用next方法才会执行
// generator.next()

const result = generator.next()   // 注意:next不能重复调用

console.log(result);

 done关键词用来表示 生成器是否执行完毕

yield 并不会像return一样直接执行生成结果,而是暂停生成器的执行,直到外界在此调用next方法才会在yield处再次往下执行。

Object [Generator] {}
strat
{ value: 'foo', done: false }

function* main() {
    const res = yield ajax('url')
    console.log(res);
}

const g = main() // 生成生成器对象

const result = g.next() // yield执行ajax请求

result.value.then(data => {  // {value  , done}
    g.next(data) // 执行yield返回值
})

console.log(result); //得到请求返回值

通过Generator修饰promise请求,得到了近乎于同步执行的异步编程方式。

直到done为true,才会结束yield执行。

可以通过递归的形式判断done属性是否为true结束执行

if(result.done) return

 递归执行Genrator

function* main() {
    try {
        const res = yield ajax('url')
        const res1 = yield ajax('url1')
        const res2 = yield ajax('url2')
        const res3 = yield ajax('url3')
    } catch (error) {
        console.log(error);
    }
}

function handleResult(result) {
    if (result.done) return
    result.value.then(data => {
        handleResult(g.next(data))
    }, error => {
        g.throw(error)
    })
}

handleResult(g.next())

 Co库

以上是关于JavaScript中ES6新特性-Generator异步方案的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript学习--Item24 ES6新特性概览

前端入门21-JavaScript的ES6新特性

javascript ES6 新特性之 扩展运算符 三个点 ...

ES6 有什么新东西

JavaScript中ES6新特性-Generator异步方案

JavaScript:ES6的新特性