基于生成器的Javascript协程库支持Chrome浏览器

时间:2014-02-04 02:57:21

标签: javascript google-chrome generator coroutine yield-keyword

Javascript生成器不能帮助太多,因为它不是真正的协同程序。所以我希望在浏览器中使用一些新的ecmascript 6关键字“yield”来进行协程。即,我希望我可以在callstack中产生多个帧。

据我所知,我刚刚在Firefox上找到了一个基于Javascript 1.7+的协程库,可以在http://www.neilmix.com/2007/02/07/threading-in-javascript-17/找到。

Chrome浏览器已经支持“yield”很长一段时间了。所以我想知道有一个使用Javascript生成器支持Chrome浏览器的协程实现。

谢谢!

1 个答案:

答案 0 :(得分:1)

Q libraryasync提供wrap a JavaScript generator function方法。在生成器函数内部,您可以使用yield关键字异步等待任何Q promise对象,例如:

function delay(ms) {
    var deferred = Q.defer();
    setTimeout(deferred.resolve, ms);
    return deferred.promise;
}

function main()
{
    var callback = Q.async(function*(){
        var bodyStyle = document.body.style;

        yield delay(1000);
        bodyStyle.backgroundColor = "red";
        printOutput("step 1");

        yield delay(1000);
        bodyStyle.backgroundColor = "green";
        printOutput("step 2");

        yield delay(1000);
        bodyStyle.backgroundColor = "blue";
        printOutput("step 3");

        yield delay(1000);
        printOutput("step 4");
        bodyStyle.backgroundColor = "white";
    });

    Q.fcall(callback).then(function (){
        printOutput("Done!");
    });
}

这是 working fiddle 。在运行之前,请务必在Chrome中启用JavaScript Harmony(chrome://flags/#enable-javascript-harmony)。