JavaScript的Promise是用于处理异步操作的一种方法。Promise对象代表一个异步操作的最终完成(或失败)及其结果值。下面介绍Promise的各种用法,包括创建Promise、链式调用、错误处理、Promise.all、Promise.race、Promise.any等。
1. 创建Promise
const myPromise = new Promise((resolve, reject) => {
// 异步操作
let condition = true;
if (condition) {
resolve('Success!'); // 操作成功
} else {
reject('Failure!'); // 操作失败
}
});
2. 使用.then()和.catch()
myPromise
.then(result => {
console.log(result); // 'Success!'
})
.catch(error => {
console.error(error); // 'Failure!'
});
3. 链式调用
myPromise
.then(result => {
console.log(result);
return 'Another success';
})
.then(newResult => {
console.log(newResult);
})
.catch(error => {
console.error(error);
});
4. .finally()
myPromise
.then(result => {
console.log(result);
})
.catch(error => {
console.error(error);
})
.finally(() => {
console.log('Operation complete.');
});
5. Promise.all
Promise.all用于等待所有Promise都完成或其中一个Promise被拒绝。
const promise1 = Promise.resolve(3);
const promise2 = 42;
const promise3 = new Promise((resolve, reject) => {
setTimeout(resolve, 100, 'foo');
});
Promise.all([promise1, promise2, promise3])
.then(values => {
console.log(values); // [3, 42, "foo"]
})
.catch(error => {
console.error(error);
});
6. Promise.race
Promise.race用于等待第一个Promise完成或拒绝。
const promise1 = new Promise((resolve, reject) => {
setTimeout(resolve, 500, 'one');
});
const promise2 = new Promise((resolve, reject) => {
setTimeout(resolve, 100, 'two');
});
Promise.race([promise1, promise2])
.then(value => {
console.log(value); // 'two'
})
.catch(error => {
console.error(error);
});
7. Promise.any
Promise.any用于等待第一个Promise完成,忽略拒绝的Promise。
const promise1 = new Promise((resolve, reject) => {
setTimeout(reject, 100, 'one');
});
const promise2 = new Promise((resolve, reject) => {
setTimeout(resolve, 200, 'two');
});
const promise3 = new Promise((resolve, reject) => {
setTimeout(resolve, 300, 'three');
});
Promise.any([promise1, promise2, promise3])
.then(value => {
console.log(value); // 'two'
})
.catch(error => {
console.error(error);
});
8. Promise.allSettled
Promise.allSettled用于等待所有Promise完成(无论成功或失败)。
const promise1 = Promise.resolve('Success');
const promise2 = Promise.reject('Error');
const promise3 = new Promise((resolve, reject) => {
setTimeout(resolve, 100, 'Another success');
});
Promise.allSettled([promise1, promise2, promise3])
.then(results => {
results.forEach((result) => console.log(result));
// { status: 'fulfilled', value: 'Success' }
// { status: 'rejected', reason: 'Error' }
// { status: 'fulfilled', value: 'Another success' }
});
9. Promisify
将回调函数转换为Promise形式。
const fs = require('fs');
const util = require('util');
const readFile = util.promisify(fs.readFile);
readFile('example.txt', 'utf8')
.then(data => {
console.log(data);
})
.catch(error => {
console.error(error);
});
10. Async/Await
使用async和await来处理Promise,使代码更简洁
async function fetchData() {
try {
const response = await axios.get('https://api.example.com/data');
console.log(response.data);
} catch (error) {
console.error(error);
}
}
fetchData();
11. Custom Promises
function delay(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
delay(1000)
.then(() => {
console.log('Executed after 1 second');
});