koa框架2 基础入门之generator、yield

generator可以理解为一个可以分段执行内部代码的函数,通过yield分隔,yield接一个promise异步,这个异步完成,才能执行下一个代码片段。(异步的请求同步的写法)

就好像是将一个异步的操作,转为同步了,但是,不是很方便,因为每一个片段运行结束后,需要执行next()才能进行下一个片段。

创建generator

和普通函数差不多,不过,他需要在函数名的前面加一个*星号,这个星号可以和function字母挨在一起,也可以和函数名挨在一起,但是,function和名字必须要有空格,不管星号挨谁。

function* name() {

}

function* name() {

}

function* () {

}

其中匿名函数的话,一般配合一个库runner。

创建就这样。

runner库

这个是一个用于自动执行generator函数的封装库,其代码如下:

function runner(_gen) {
    return new Promise((resolve, reject) => {
        var gen = _gen();

        _next();

        function _next(_last_res) {
            var res = gen.next(_last_res);

            if (!res.done) {
                var obj = res.value;

                if (obj.then) {
                    obj.then((res) => {
                        _next(res);
                    }, (err) => {
                        reject(err);
                    });
                } else if (typeof obj == 'function') {
                    if (obj.constructor.toString().startsWith('function GeneratorFunction()')) {
                        runner(obj).then(res => _next(res), reject);
                    } else {
                        _next(obj());
                    }
                } else {
                    _next(obj);
                }
            } else {
                resolve(res.value);
            }
        }
    });
}

有需要自行复制然后存储为js文件,再应用,然后调用runner(),将generator作为参数传给runner就行了。

generator基本用法

function* ge() {
    console.log(1);

    yield;

    console.log(2);
};


let g = ge();
g.next();
g.next();

这里创建了ge函数,ge被yield分成两段代码,第一段输出1,第二段输出2。

然后我们运行这个函数,并赋值给g变量。因为generator不会直接运行里面的函数,他需要运行一次next才执行一次代码,所以我们next两次才运行完两段代码。

这就是他和传统函数的不同之处。

yield

他的作用实际上是将后面的代码,行内哈,不是后面的代码段,一般情况下yield后面是要接异步请求的,他会将异步请求抛出,然后外部获取到这个异步运行后,异步返回数据,然后执行next。

使用runner

runner(function*() {
    let user = yield $.ajax({
        url: "xxx/api",
        dataType: "json"
    });

    let items = null;
    if (user.login) {
        items = yield $.ajax({
            url: "xxx/api",
            dataType: "json"
        });
    } else {
        if (user.vip) {
            items = yield $.ajax({
                url: "xxx/api",
                dataType: "json"
            });
        } else {
            items = yield $.ajax({
                url: "xxx/api",
                dataType: "json"
            });
        }
    }

    console.log(items);
});

这里我们判断用户是否登录,未登录获取未登录的数据,已登录判断是否是vip,是vip获取vip数据,不是则获取普通数据。

这里我们使用了runner自动运行next。

这种写法和传统ajax请求写法不同,传统的ajax请求如果按照这种要求,起码要嵌套好几次ajax才行,而这里基本上都在一个作用域内。能做到这样也是因为他这个方式,异步的请求同步的写法

分类: Node 标签: generatoryieldrunner

评论

暂无评论数据

暂无评论数据

目录