【问题标题】:Generator based Javascript coroutine library supporting Chrome browser支持 Chrome 浏览器的基于生成器的 Javascript 协程库
【发布时间】:2014-02-27 19:31:35
【问题描述】:

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

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

“yield”在 Chrome 浏览器中支持很久了。所以我想知道有一个协程实现支持使用 Javascript 生成器的 Chrome 浏览器。

谢谢!

【问题讨论】:

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


【解决方案1】:

Q librarywrap a JavaScript generator function 提供async 方法。在生成器函数内部,您可以异步等待任何带有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 (chrome://flags/#enable-javascript-harmony) 中启用 JavaScript Harmony。

【讨论】:

  • 谢谢。问很有趣。但是,它仍然不是超级自然。如果某个库的行为类似于 Windows 光纤,那就太好了。
  • @LinZ,最接近 JavaScript 的东西是 waitfor-ES6,但它是 Node.js 特有的。 OTOH,Q 承诺 + 生成器更像是 C# 5.0 中的 Task 对象和 async/await,这是我目前更喜欢的东西。如果您发现其他更适合您的内容,请随时回答您自己的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-11
  • 2012-05-09
  • 1970-01-01
  • 2011-02-20
  • 1970-01-01
  • 2014-01-20
  • 2013-11-19
相关资源
最近更新 更多