skip to content
luminary.blog
by Oz Akan
cup of java in binary

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);
}
// usage
printMessage("Function");
Terminal window
# output
Function

Arrow Function

const printMessage = (message: string) => {
console.log(message);
};
// usage
printMessage("Arrow Function");
Terminal window
# output
Arrow Function

Calling One Function from Another

const printMessage = (message: string) => {
console.log(message);
};
const getMessage = () => {
const message = "Function Calling Another Function";
printMessage(message);
};
// usage
getMessage();
Terminal window
# output
Function Calling Another Function

Async Function

const printMessage = (message: string) => {
console.log(message);
};
const getMessageAsync = () => {
const message = "Async Function";
setTimeout(() => {
printMessage(message);
}, 1000);
};
// usage
console.log("start");
getMessageAsync(); // prints after 1000 milliseconds
console.log("end");
Terminal window
# output
start
end
Async 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);
};
// usage
getMessageWithCallback((message: string) => {
printMessage(message);
});
// usage 2
getMessageWithCallback(printMessage);
Terminal window
# output
Async 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);
};
// usage
getMessageWithVariables(
"Async Function with a Callback Function and a Variable",
(message: string) => printMessage(message)
);
// usage 2
getMessageWithVariables(
"Async Function with a Callback Function and a Variable",
printMessage
);
Terminal window
# output
Async 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);
});
};
// usage
getMessagePromise("Async Function Returning A Promise").then(
(message: string) => {
printMessage(message);
}
);
// usage 2
getMessagePromise("Async Function Returning A Promise").then(printMessage);
Terminal window
# output
Async 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);
});
};
// usage
getMessagePromiseFull(
"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`));
Terminal window
# output
Async Function Returning a Promise with a Message or an Error
Promise 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 - success
divide(4, 2)
.then(printResult)
.catch((err) => console.log(err.message))
.finally(() => console.log("Operation Complete")); // optional
// usage - error
divide(1, 0)
.then(printResult)
.catch((err) => console.log(err.message))
.finally(() => console.log("Operation Complete")); // optional
Terminal window
# output for (4, 2)
2
Operation Complete
# output for (1, 0)
Division Error
Operation 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);
}
};
// usage
getMessages();
Terminal window
# output
Error: Message Error
# output
Promise Example Message 1
Error: Message Error
# output
Promise Example Message 1
Promise 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);
}
};
// usage
calculate(4, 2);
Terminal window
# output
3
Result 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;
};
// usage
calculate(4, 2)
.then((result) => {
printResult(result);
printOddEven(result);
})
.catch((err) => console.log(err.message))
.finally(() => console.log("Operation Complete."));
Terminal window
# output
3
Result is odd
Operation 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'),
};
// usage
observable.subscribe(subscriber);
Terminal window
# output
Value: 1
Value: 2
Value: 3
Value: 4
Complete

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));
Terminal window
# output
Squared Even Number: 4
Squared 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
});
Terminal window
# 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();
Terminal window
# 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();
Terminal window
# output
User data for 123
Order 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();
Terminal window
# output
Fetch cancelled