下面为你介绍 JavaScript 中 Promise 的几个些常用场景及实现示例,这些场景在实际开发中经常会遇到。
1. 异步请求处理
Promise 最常见的用途之一是处理异步请求,比如使用 fetch API 调用后端接口:
// 发起 GET 请求
fetch('https://api.example.com/data')
.then(response => {
if (!response.ok) {
throw new Error('网络请求失败');
}
return response.json(); // 解析 JSON 数据
})
.then(data => {
console.log('获取到的数据:', data);
// 处理数据
})
.catch(error => {
console.error('请求出错:', error.message);
})
.finally(() => {
console.log('请求完成(无论成功或失败)');
});
2. 定时器操作
使用 Promise 封装定时器,可以更优雅地处理延迟操作:
// 封装延迟函数
function delay(ms) {
return new Promise((resolve) => {
setTimeout(resolve, ms);
});
}
// 使用
console.log('开始');
delay(2000)
.then(() => {
console.log('2秒后执行');
return delay(1000);
})
.then(() => {
console.log('再1秒后执行');
});
3. 并行执行多个异步操作
使用 Promise.all() 可以并行执行多个异步操作,等待所有操作完成后再处理结果:
// 模拟三个异步操作
const promise1 = fetch('https://api.example.com/data1').then(res => res.json());
const promise2 = fetch('https://api.example.com/data2').then(res => res.json());
const promise3 = new Promise(resolve => setTimeout(() => resolve(3), 1000));
Promise.all([promise1, promise2, promise3])
.then(results => {
console.log('所有操作完成:', results);
// results 是一个数组,包含三个操作的结果
})
.catch(error => {
console.error('其中一个操作失败:', error);
});
4. 只需要第一个完成的异步操作
使用 Promise.race() 可以等待第一个完成的异步操作:
// 模拟多个异步操作,其中一个会更快完成
const promiseA = new Promise(resolve => setTimeout(() => resolve('A完成'), 1000));
const promiseB = new Promise(resolve => setTimeout(() => resolve('B完成'), 500));
const promiseC = new Promise(resolve => setTimeout(() => resolve('C完成'), 1500));
Promise.race([promiseA, promiseB, promiseC])
.then(result => {
console.log('第一个完成的操作:', result); // 会输出 "B完成"
});
5. 异步操作队列
通过链式调用实现异步操作的顺序执行:
// 模拟异步任务
function asyncTask(taskName, delayMs) {
return new Promise(resolve => {
setTimeout(() => {
console.log(`任务 ${
taskName} 完成`);
resolve(taskName);
}, delayMs);
});
}
// 按顺序执行任务
asyncTask('任务1', 1000)
.then(() => asyncTask('任务2', 500))
.then(() => asyncTask('任务3', 1500))
.then(() => console.log('所有任务执行完毕'));
6. 与 async/await 结合使用
Promise 与 async/await 结合可以写出更像同步代码的异步逻辑:
// 结合 async/await 使用 Promise
async function fetchData() {
try {
const response = await fetch('https://api.example.com/data');
if (!response.ok) {
throw new Error('网络请求失败');
}
const data = await response.json();
console.log('获取到的数据:', data);
return data;
} catch (error) {
console.error('请求出错:', error.message);
throw error; // 可以将错误继续抛出
} finally {
console.log('请求处理完成');
}
}
// 调用
fetchData();
这些示例覆盖了 Promise 在实际开发中的大部分常见用法。Promise 的主要优势在于能够更好地处理异步操作的流程,避免回调地狱,使代码结构更清晰、更易于维护。