A coroutine javascript implement. Some Unity-like yieldable items are provided to make asynchronous programming more graceful.
The Callback object can be used to solve the well-known "callback hell", so that code can be written in a fully synchronized style. Example below shows an HTTP response:
new Coroutine(function*()
{
var callback = new Callback();
request("https://github.com/9087/coroutine.js", callback);
// the yield return value is the callback argument list
var [error, message] = yield callback;
// check error and do something with incoming message
}
()).Start();
Example of timeout control:
new Coroutine(function*()
{
try
{
console.log(new Date() + " -> Start");
// wait for two seconds but timeout after one second
yield new Wait(new WaitForSeconds(2.0), 1.0);
console.log(new Date() + " -> End");
}
catch (error)
{
// the Wait object throw an error on timeout
console.log(new Date() + " -> " + error);
}
}
()).Start();
Interrupt a running coroutine:
class WaitForSecondsWithInterruptLog extends WaitForSeconds
{
OnInterrupted()
{
console.log(new Date() + " -> Interrupted");
}
}
var example = new Coroutine(function*()
{
console.log(new Date() + " -> Start");
yield new WaitForSecondsWithInterruptLog(2.0);
console.log(new Date() + " -> End");
}
());
example.Start();
new Coroutine(function*()
{
yield new WaitForSeconds(1.0);
example.Interrupt();
}
()).Start();
Return result in Coroutine:
new Coroutine(function*()
{
var [hello] = yield new Coroutine(function*()
{
yield new Return("Hello, coroutine.js!");
}
());
console.log(hello);
}
()).Start();
Default yieldable items are listed below:
- Generator
- Coroutine
- Callback
- WaitForSeconds
- Wait
- Promise
- Return
Customize more YieldInstruction subclasses to support whatever you need. :)