Channel Synchronization in TypeScript
Our example demonstrates how to use asynchronous operations to synchronize execution across different parts of a program. In TypeScript, we’ll use Promises to achieve a similar effect.
import { setTimeout } from 'timers/promises';
// This is the function we'll run asynchronously. The
// returned Promise will be used to notify when this
// function's work is done.
async function worker(): Promise<void> {
process.stdout.write("working...");
await setTimeout(1000);
console.log("done");
}
async function main() {
// Start a worker asynchronous operation
const done = worker();
// Block until we receive a notification that the
// worker has completed
await done;
}
main().catch(console.error);To run the program:
$ ts-node channel-synchronization.ts
working...doneIf you removed the await done line from this program, the program would exit before the worker even started.
In this TypeScript version:
We use an async function
workerthat returns a Promise, which is analogous to the channel in the original example.The
setTimeoutfunction from thetimers/promisesmodule is used to create a delay, similar totime.Sleepin the original.In the
mainfunction, we start the worker asynchronously and then wait for it to complete usingawait.We wrap the
mainfunction execution in a catch block to handle any errors that might occur during the asynchronous operations.
This approach provides a way to synchronize asynchronous operations in TypeScript, similar to how channels are used for goroutine synchronization in the original example.