当前位置:  开发笔记 > 编程语言 > 正文

在javascript中实际使用双向生成器

如何解决《在javascript中实际使用双向生成器》经验,为你挑选了1个好方法。



1> Xotic750..:

David Walsh有一个关于ES6 Generators的博客

他有一个例子

function *foo(x) {
    var y = 2 * (yield (x + 1));
    var z = yield (y / 3);
    return (x + y + z);
}

var it = foo( 5 );

// note: not sending anything into `next()` here
console.log( it.next() );       // { value:6, done:false }
console.log( it.next( 12 ) );   // { value:8, done:false }
console.log( it.next( 13 ) );   // { value:42, done:true }

但同样,用例就像你的例子一样制造.

在他的总结中,他说

很自然地想知道这个新奇特的玩具会为你的代码做些什么.不过,他们还有更多.我们刚刚触及表面.因此,在我们发现它们能够/将会有多强大之前,我们必须深入研究.

错误处理如何工作?

一台发电机能调用另一台发电机

异步编码如何与生成器一起工作?

这些问题以及更多内容将在后续文章中介绍,敬请期待!

在稍后的博客中,他有以下片段(以及其他一些片段)

// run (async) a generator to completion
// Note: simplified approach: no error handling here
function runGenerator(g) {
    var it = g(), ret;

    // asynchronously iterate over generator
    (function iterate(val){
        ret = it.next( val );

        if (!ret.done) {
            // poor man's "is it a promise?" test
            if ("then" in ret.value) {
                // wait on the promise
                ret.value.then( iterate );
            }
            // immediate value: just send right back in
            else {
                // avoid synchronous recursion
                setTimeout( function(){
                    iterate( ret.value );
                }, 0 );
            }
        }
    })();
}

runGenerator( function *main(){
    var result1 = yield request( "http://some.url.1" );
    var data = JSON.parse( result1 );

    var result2 = yield request( "http://some.url.2?id=" + data.id );
    var resp = JSON.parse( result2 );
    console.log( "The value you asked for: " + resp.value );
} );

这似乎更真实的世界.

他总结道

简单地说:生成器+产生的promise(s)结合了两个世界的优点,以获得真正强大而优雅的同步( - 查看)异步流控制表达能力.使用简单的包装器实用程序(许多库已经提供),我们可以自动运行我们的生成器,包括理智和同步(查看)错误处理!

推荐阅读
oDavid_仔o_880
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有