Promise
constructor takes an executor function that executes in the background
let promise = new Promise(function(resolve, reject) {
// Execute immediately
});
resolve
parameter is a function to call when executor function has completed successfully (state becomes fulfilled)
let promise = new Promise(function(resolve, reject) {
// Simulate time-intensive operation; after 1 second indicate result is "Done"
setTimeout(() => resolve("Done"), 1000);
});
reject
parameter is a function to call when executor function has completed unsuccessfully (state becomes rejected)
let promise = new Promise(function(resolve, reject) {
// Simulate time-intensive operation; after 1 second indicate problem
setTimeout(() => reject(new Error("Something went wrong")), 1000);
});
reject()
is usually called with an Error object
resolve()
or reject()
may be called at any time, even immediately
let promise = new Promise(function(resolve, reject) {
// Simulate time-intensive; after 1 second indicate result is "done"
setTimeout(() => resolve("Done"), 1000);
});
promise.then(
result => alert(result), // Shows "Done" after 1 second
error => alert(error) // Doesn't run
);
let promise = new Promise(function(resolve, reject) {
// Simulate time-intensive; after 1 second indicate result is "done"
setTimeout(() => reject(new Error("Something went wrong")), 1000);
});
promise.then(
result => alert(result), // Doesn't run
error => alert(error) // Shows "Error: Something went wrong" after 1 second
);
promise
.then(result => alert(result))
.catch(error => alert(error));
then(null, errorFunc)
catch()
executes
// Displays two alerts
promise
.then(result => {
alert("In fulfilled callback");
throw new Error("Something went wrong");
})
.catch(error => alert(error));
function isEven(num) {
return new Promise(function(resolve, reject) {
if (!Number.isInteger(num)) {
setTimeout(() => reject(new Error("Argument is not an integer")), 1000);
}
if (num % 2 == 0) {
setTimeout(() => resolve(true), 1000);
}
else {
setTimeout(() => resolve(false), 1000);
}
});
}
isEven(2)
.then(result => alert(result))
.catch(error => alert(error));
// Simplified
isEven(3).then(alert).catch(alert);
// Catch executes
isEven(4.5).then(alert).catch(alert);
then()
method is to use await
inside an async function
async function test() {
// Equivalent to return Promise.resolve("test");
return "test";
}
// Displays "test"
test().then(alert);
await
can only be used in an async function
try-catch
to catch exception from a rejected promise
async function tryNums() {
const nums = [2, 3, 4, 6.5];
for (let n of nums) {
try {
const result = await isEven(n);
console.log(`${n} is ${result}`);
}
catch (ex) {
console.log(`Error for ${n}: ${ex}`);
}
}
}
tryNums();
2 is true 3 is false 4 is true Error for 6.5: Error: Argument is not an integer