JavaScript Promises Tutorial - Section 2: Fundamentals
const promise = new Promise((resolve, reject) => {
// Executor function body
});
new Promise() - Creates a new Promise object(resolve, reject) => { }resolve(value) - Fulfills the promise with a valuereject(reason) - Rejects the promise with a reasonThe executor function runs immediately when the Promise is created:
console.log('Before');
const promise = new Promise((resolve, reject) => {
console.log('Executor runs immediately!');
resolve();
});
console.log('After');
// Output:
// Before
// Executor runs immediately!
// After
Key Points:
resolve and rejectCall resolve(value) when the async operation succeeds:
const successPromise = new Promise((resolve, reject) => {
setTimeout(() => {
const data = { id: 1, name: 'Success' };
resolve(data); // Fulfill with data
}, 1000);
});
successPromise.then(data => {
console.log('Received:', data);
});
// Primitive values
resolve(42);
resolve('Hello');
resolve(true);
// Objects
resolve({ key: 'value' });
resolve([1, 2, 3]);
// Even another Promise!
resolve(anotherPromise);
// Undefined (no value)
resolve();
Call reject(reason) when the async operation fails:
const failurePromise = new Promise((resolve, reject) => {
setTimeout(() => {
reject(new Error('Something went wrong'));
}, 1000);
});
failurePromise.catch(error => {
console.error('Error:', error.message);
});
// ✅ Good - Error object with stack trace
reject(new Error('Database connection failed'));
// ❌ Bad - String (no stack trace)
reject('Database connection failed');
// ❌ Bad - Undefined
reject();
function delay(ms) {
return new Promise(resolve => {
setTimeout(resolve, ms);
});
}
delay(2000).then(() => {
console.log('2 seconds later');
});
const fs = require('fs');
function readFilePromise(path) {
return new Promise((resolve, reject) => {
fs.readFile(path, 'utf8', (error, data) => {
if (error) {
reject(error);
} else {
resolve(data);
}
});
});
}
readFilePromise('file.txt')
.then(content => console.log(content))
.catch(error => console.error(error));
function checkStock(itemId) {
return new Promise((resolve, reject) => {
const inStock = Math.random() > 0.5;
setTimeout(() => {
if (inStock) {
resolve({ itemId, quantity: 10 });
} else {
reject(new Error('Out of stock'));
}
}, 1000);
});
}
new Promise((resolve, reject) => {
resolve('First');
resolve('Second'); // Ignored!
reject('Error'); // Ignored!
});
The first call wins, all subsequent calls are ignored.
If the executor throws an error, the Promise is automatically rejected:
const promise = new Promise((resolve, reject) => {
throw new Error('Oops!');
// Equivalent to: reject(new Error('Oops!'));
});
promise.catch(error => {
console.error(error.message); // 'Oops!'
});
function fetchUser(userId) {
return new Promise((resolve, reject) => {
console.log(`Fetching user ${userId}...`);
setTimeout(() => {
if (userId <= 0) {
reject(new Error('Invalid user ID'));
return;
}
const user = {
id: userId,
name: `User ${userId}`,
email: `user${userId}@example.com`
};
resolve(user);
}, 1500);
});
}
fetchUser(5)
.then(user => console.log('User:', user))
.catch(error => console.error('Error:', error.message));
new Promise((resolve, reject) => {}) to create Promisesresolve(value) for success, reject(error) for failureNext, we'll learn how to consume Promises using .then(), .catch(), and .finally().