
Asynchronous Typescript Code Examples
Asynchronous programming in TypeScript, callbacks, promises, await/async, RxJS.
/ 7 min read
Updated:Table of Contents
Functions
Function
function printMessage(message: string) { console.log(message);}
// usageprintMessage("Function");
# outputFunction
Arrow Function
const printMessage = (message: string) => { console.log(message);};
// usageprintMessage("Arrow Function");
# outputArrow Function
Calling One Function from Another
const printMessage = (message: string) => { console.log(message);};
const getMessage = () => { const message = "Function Calling Another Function"; printMessage(message);};
// usagegetMessage();
# outputFunction Calling Another Function
Async Function
const printMessage = (message: string) => { console.log(message);};
const getMessageAsync = () => { const message = "Async Function"; setTimeout(() => { printMessage(message); }, 1000);};
// usageconsole.log("start");getMessageAsync(); // prints after 1000 millisecondsconsole.log("end");
# outputstartendAsync Function
Async Function With a Callback
const printMessage = (message: string) => { console.log(message);};
const getMessageWithCallback = (callback: Function) => { const message = "Async Function with a Callback Function"; setTimeout(() => { callback(message); }, 1000);};
// usagegetMessageWithCallback((message: string) => { printMessage(message);});
// usage 2getMessageWithCallback(printMessage);
# outputAsync Function with a Callback Function
Async Function With a Callback and a Variable
const printMessage = (message: string) => { console.log(message);};
const getMessageWithVariables = (message: string, callback: Function) => { setTimeout(() => { callback(message); }, 1000);};
// usagegetMessageWithVariables( "Async Function with a Callback Function and a Variable", (message: string) => printMessage(message));
// usage 2getMessageWithVariables( "Async Function with a Callback Function and a Variable", printMessage);
# outputAsync Function with a Callback Function and a Variable
Promises
Simple Example
const printMessage = (message: string) => { console.log(message);};
const getMessagePromise = (message: string): Promise<string> => { return new Promise((resolve, reject) => { setTimeout(() => { resolve(message); reject(new Error("Promise Error")); }, 1000); });};
// usagegetMessagePromise("Async Function Returning A Promise").then( (message: string) => { printMessage(message); });
// usage 2getMessagePromise("Async Function Returning A Promise").then(printMessage);
# outputAsync Function Returning A Promise
Complete Example
const printMessage = (message: string) => { console.log(message);};
const trueFalse = (): boolean => { return Math.random() < 0.5;};
const getMessagePromiseFull = (message: string) => { return new Promise((resolve, reject) => { setTimeout(() => { trueFalse() ? resolve(message) : reject(new Error("Message Error")); }, 1000); });};
// usagegetMessagePromiseFull( "Async Function Returning a Promise with a Message or an Error") .then((message) => printMessage(<string>message)) .catch((err) => console.log(err.message)) .finally(() => console.log(`Promise resolved`));
# outputAsync Function Returning a Promise with a Message or an ErrorPromise Resolved
Division Example
const printResult = (result: number) => { console.log(result);};
const divide = (a: number, b: number): Promise<number> => { return new Promise((resolve, reject) => { setTimeout(() => { if (b === 0) reject(new Error("Division Error!")); resolve(a / b); }, 1000); });};
// usage - successdivide(4, 2) .then(printResult) .catch((err) => console.log(err.message)) .finally(() => console.log("Operation Complete")); // optional
// usage - errordivide(1, 0) .then(printResult) .catch((err) => console.log(err.message)) .finally(() => console.log("Operation Complete")); // optional
# output for (4, 2)2Operation Complete
# output for (1, 0)Division ErrorOperation Complete
Async / Await
Example 1
const printMessage = (message: string) => { console.log(message);};
const trueFalse = (): boolean => { return Math.random() < 0.5;};
const getMessagePromiseFull = (message: string) => { return new Promise((resolve, reject) => { setTimeout(() => { trueFalse() ? resolve(message) : reject(new Error("Message Error")); }, 1000); });};
const getMessages = async () => { try { const message1 = await getMessagePromiseFull("Promise Example Message 1"); console.log(message1); const message2 = await getMessagePromiseFull("Promise Example Message 2"); console.log(message2); } catch (err: any) { console.log("Error:", err.message); }};
// usagegetMessages();
# outputError: Message Error
# outputPromise Example Message 1Error: Message Error
# outputPromise Example Message 1Promise Example Message 2
Division Example
const printResult = (result: number) => { console.log(result);};
const printOddEven = (value: number) => { value % 2 === 0 ? console.log("Result is even") : console.log("Result is odd");};
const divide = (a: number, b: number): Promise<number> => { return new Promise((resolve, reject) => { setTimeout(() => { if (b === 0) reject(new Error("Division Error!")); resolve(a / b); }, 1000); });};
const addOne = (a: number): Promise<number> => { return new Promise((resolve, reject) => { setTimeout(() => { resolve(a + 1); }, 1000); });};
const calculate = async (a: number, b: number) => { try { const division = await divide(a, b); const result = await addOne(division); printResult(result); printOddEven(result); } catch (err) { console.log(err.message); }};
// usagecalculate(4, 2);
# output3Result is odd
Division Example with Return
const printResult = (result: number) => { console.log(result);};
const printOddEven = (value: number) => { value % 2 === 0 ? console.log("Result is even") : console.log("Result is odd");};
const divide = (a: number, b: number): Promise<number> => { return new Promise((resolve, reject) => { setTimeout(() => { if (b === 0) reject(new Error("Division Error!")); resolve(a / b); }, 1000); });};
const addOne = (a: number): Promise<number> => { return new Promise((resolve, reject) => { setTimeout(() => { resolve(a + 1); }, 1000); });};
const calculate = async (a: number, b: number): Promise<number> => { const division = await divide(a, b); const result = await addOne(division); return result;};
// usagecalculate(4, 2) .then((result) => { printResult(result); printOddEven(result); }) .catch((err) => console.log(err.message)) .finally(() => console.log("Operation Complete."));
# output3Result is oddOperation Complete.
RxJS
Observable
An Observable represents a stream of data or events over time.
import { Observable } from 'rxjs';
const observable = new Observable<number>((subscriber) => { subscriber.next(1); subscriber.next(2); subscriber.next(3); setTimeout(() => { subscriber.next(4); subscriber.complete(); }, 1000);});
Subscriber
A Subscriber is an object that listens to an Observable and reacts to the values emitted by the Observable.
const subscriber = { next: (value: number) => console.log('Value:', value), error: (err: any) => console.error('Error:', err), complete: () => console.log('Complete'),};
// usageobservable.subscribe(subscriber);
# outputValue: 1Value: 2Value: 3Value: 4Complete
Operators
Operators are functions that transform, filter, or combine Observables.
import { from, map, filter } from 'rxjs';
const numbers = from([1, 2, 3, 4, 5]);
const squaredEvenNumbers = numbers.pipe( filter(x => x % 2 === 0), map(x => x * x));
squaredEvenNumbers.subscribe(x => console.log('Squared Even Number:', x));
# outputSquared Even Number: 4Squared Even Number: 16
Error Handling
Promises
function fetchData(shouldSucceed: boolean): Promise<string> { return new Promise((resolve, reject) => { setTimeout(() => { if (shouldSucceed) { resolve("Data fetched successfully"); } else { reject(new Error("Failed to fetch data")); } }, 1000); });}
fetchData(true) .then((data) => { console.log(data); }) .catch((error) => { console.error(error.message); });
fetchData(false) .then((data) => { console.log(data); }) .catch((error) => { console.error(error.message); // Output: Failed to fetch data });
# output (success)Data fetched successfully
# output (failure)Failed to fetch data
Async/Await
async function fetchData(shouldSucceed: boolean): Promise<string> { return new Promise((resolve, reject) => { setTimeout(() => { if (shouldSucceed) { resolve("Data fetched successfully"); } else { reject(new Error("Failed to fetch data")); } }, 1000); });}
async function main() { try { const data = await fetchData(true); console.log(data); } catch (error: any) { console.error(error.message); }
try { const data = await fetchData(false); console.log(data); } catch (error: any) { console.error(error.message); // Output: Failed to fetch data }}
main();
# output (success)Data fetched successfully
# output (failure)Failed to fetch data
Concurrent Operations
async function fetchUserData(userId: number): Promise<string> { return new Promise((resolve) => { setTimeout(() => { resolve(`User data for ${userId}`); }, 500); });}
async function fetchOrderData(orderId: number): Promise<string> { return new Promise((resolve) => { setTimeout(() => { resolve(`Order data for ${orderId}`); }, 750); });}
async function main() { const [userData, orderData] = await Promise.all([ fetchUserData(123), fetchOrderData(456), ]);
console.log(userData); // Output: User data for 123 console.log(orderData); // Output: Order data for 456}
main();
# outputUser data for 123Order data for 456
Cancellation of Async Operations
async function fetchData(signal: AbortSignal): Promise<string> { return new Promise((resolve, reject) => { const timeoutId = setTimeout(() => { resolve("Data fetched successfully"); }, 1000);
signal.addEventListener("abort", () => { clearTimeout(timeoutId); reject(new Error("Fetch cancelled")); }); });};
async function main() { const controller = new AbortController(); const signal = controller.signal;
const fetchPromise = fetchData(signal);
setTimeout(() => { controller.abort(); // Cancel the fetch after 500ms }, 500);
try { const data = await fetchPromise; console.log(data); } catch (error: any) { console.error(error.message); // Output: Fetch cancelled }}
main();
# outputFetch cancelled