Javascript生成器不能帮助太多,因为它不是真正的协同程序。所以我希望在浏览器中使用一些新的ecmascript 6关键字“yield”来进行协程。即,我希望我可以在callstack中产生多个帧。
据我所知,我刚刚在Firefox上找到了一个基于Javascript 1.7+的协程库,可以在http://www.neilmix.com/2007/02/07/threading-in-javascript-17/找到。
Chrome浏览器已经支持“yield”很长一段时间了。所以我想知道有一个使用Javascript生成器支持Chrome浏览器的协程实现。
谢谢!
答案 0 :(得分:1)
Q library向async
提供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
)。