ES6 Generator代码如何组织最优雅?
发布于 12小时前 作者 yuyang041060120 241 次浏览 来自 问答

用到了TJ大神的co模块

写法一

const backend = {
    fetchData(){
        return $.ajax({
            type: 'GET',
            url: '/react/data.json',
            dataType: 'json'
        });
    }
};
class App {
    props = {
        name: 'xxx'
    }

    constructor() {
        this.fetch();
    }

    fetch() {
        co(function* () {
            var res = yield backend.fetchData();
            console.log(res);
        }.bind(this))
            .catch(function (err) {
                console.log(err);
            });
    }
}
new App();

调用的时候很简单,但是fetch方法里写的就不够优雅,同步过程看得不明显

写法二

const backend = {
    fetchData(){
        return $.ajax({
            type: 'GET',
            url: '/react/data.json',
            dataType: 'json'
        });
    }
};  
class App {
    props = {
        name: 'xxx'
    }

    constructor() {
        co(this.fetch.bind(this))
            .catch(function (err) {
                console.log(err);
            });
    }   
    *fetch() {
        var res = yield backend.fetchData();
        console.log(res);
    }
}   
new App();

fetch方法里一目了然,看起来像真的同步,但是调用看起来一坨翔

写法三

const backend = {
    fetchData(){
        return $.ajax({
            type: 'GET',
            url: '/react/data.json',
            dataType: 'json'
        });
    }
};
class App {
    props = {
        name: 'xxx'
    }
    constructor() {
        co(this.fetch.bind(this))
    }

    *fetch() {
        try {
            var res = yield backend.fetchData();
            console.log(res);
        } catch (err) {
            console.log(err);
        }

    }
}
new App();

不用co的catch,看起来舒服点,但是co文档没教我们这样写啊

哪位大神指点下,有没有更优雅的写法?跪求

6 回复

最后一种吧,都用上yield感觉不太需要co了

@xiaokekeT 最后一种也用到了co,co是用来管理Generator的执行流程,必不可少

@yuyang041060120 的确是不可少的,我用的koa,co都做好了,就安心写第三种就好

@xiaokekeT 我这是浏览器端的代码组织

mark

来自炫酷的 CNodeMD

回到顶部