Q ライブラリは、JavaScript ジェネレーター関数をラップasync
する方法を提供します。ジェネレーター関数内では、キーワードを使用して任意の Q promise オブジェクトを非同期的に待機できます。次に例を示します。yield
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!");
});
}
ここに実用的なフィドルがあります。実行する前に、Chrome で JavaScript Harmony を有効にしてください ( chrome://flags/#enable-javascript-harmony
)。