Promise 基础概念
Promise 是 JavaScript 中处理异步操作的一种对象,代表一个异步操作的最终完成或失败及其结果值。它有三种状态:Pending(进行中)、Fulfilled(已成功)、Rejected(已失败)。
创建 Promise 的语法如下:
const promise = new Promise((resolve, reject) => {// 异步操作if (/* 成功 */) {resolve(value);} else {reject(error);}
});
Promise 链式调用
Promise 可以通过 .then()
和 .catch()
方法链式调用,处理异步操作的成功或失败结果。
promise.then(value => {// 处理成功结果return anotherValue;}).then(newValue => {// 继续处理}).catch(error => {// 处理错误});
Promise 静态方法
ES6 提供了一些静态方法简化异步操作的处理:
Promise.all()
等待所有 Promise 完成,或其中一个失败:
Promise.all([promise1, promise2]).then(values => console.log(values)).catch(error => console.error(error));
Promise.race()
返回第一个完成(成功或失败)的 Promise:
Promise.race([promise1, promise2]).then(value => console.log(value)).catch(error => console.error(error));
Promise.resolve() 和 Promise.reject()
快速创建已解决或已拒绝的 Promise:
Promise.resolve('success').then(console.log);
Promise.reject('error').catch(console.error);
异步函数(Async/Await)
Async/Await 是 ES8 引入的语法糖,基于 Promise,简化异步代码的书写。
async 函数
声明一个异步函数,返回值会被自动包装为 Promise:
async function fetchData() {return 'data';
}
await 表达式
在 async 函数中等待 Promise 完成:
async function fetchData() {const response = await fetch('https://api.example.com');const data = await response.json();return data;
}
错误处理
使用 try/catch 捕获异步操作中的错误:
async function fetchData() {try {const response = await fetch('https://api.example.com');const data = await response.json();return data;} catch (error) {console.error('Fetch failed:', error);}
}
常见应用场景
AJAX 请求
使用 Promise 封装 XMLHttpRequest 或 Fetch API:
function fetchUser(id) {return new Promise((resolve, reject) => {fetch(`https://api.example.com/users/${id}`).then(response => response.json()).then(resolve).catch(reject);});
}
定时操作
用 Promise 封装 setTimeout:
function delay(ms) {return new Promise(resolve => setTimeout(resolve, ms));
}
注意事项
- 避免 Promise 嵌套过深,尽量使用链式调用或 async/await。
- 在 async 函数中,忘记使用
await
可能导致逻辑错误。 - 使用
.catch()
或try/catch
处理错误,避免未捕获的 Promise 拒绝。