[Medium] 📄 Promise
什么是 Promise?
Promise 是 ES6 的新特性,主要是用来解决 callback hell 的问题,并且让代码更容易阅读。Promise 代表一个异步操作的最终完成或失败,以及其结果值。
Promise 有三种状态:
- pending(进行中):初始状态
- fulfilled(已完成):操作成功完成
- rejected(已拒绝):操作失败
基本用法
创建 Promise
const myPromise = new Promise((resolve, reject) => {
// 异步操作
const success = true;
if (success) {
resolve('成功!'); // 将 Promise 状态改为 fulfilled
} else {
reject('失败!'); // 将 Promise 状态改为 rejected
}
});
myPromise
.then((result) => {
console.log(result); // '成功!'
})
.catch((error) => {
console.log(error); // '失败!'
});
实际应用:处理 API 请求
// 创建一个共用 function 来处理 api 请求
function fetchData(url) {
return fetch(url)
.then((response) => {
// 检查 response 是否落在 200 ~ 299 的区间
if (!response.ok) {
throw new Error('Network response was not ok ' + response.statusText);
}
return response.json(); // 将 response 转成 json,并返回
})
.catch((error) => {
// 检查网络是否异常,或者请求被拒绝
console.log('There has been a problem with your fetch operation:', error);
throw error; // 将错误抛出
});
}
fetchData('https://jsonplaceholder.typicode.com/users/1')
.then((userData) => {
console.log('User data received:', userData);
})
.catch((error) => {
console.log('Error:', error.message);
});
Promise 的方法
.then() / .catch() / .finally()
promise
.then((result) => {
// 处理成功的情况
return result;
})
.catch((error) => {
// 处理错误
console.error(error);
})
.finally(() => {
// 无论成功或失败都会执行
console.log('Promise 完成');
});
Promise.all()
当所有 Promise 都完成时才会完成,只要有一个失败就会失败。
const promise1 = Promise.resolve(3);
const promise2 = new Promise((resolve) =>
setTimeout(() => resolve('foo'), 100)
);
const promise3 = Promise.resolve(42);
Promise.all([promise1, promise2, promise3]).then((values) => {
console.log(values); // [3, 'foo', 42]
});
使用时机:需要等待多个 API 请求都完成后才继续执行。
Promise.race()
返回第一个完成(无论成功或失败)的 Promise 结果。
const promise1 = new Promise((resolve) =>
setTimeout(() => resolve('一号'), 500)
);
const promise2 = new Promise((resolve) =>
setTimeout(() => resolve('二号'), 100)
);
Promise.race([promise1, promise2]).then((value) => {
console.log(value); // '二号'(因为较快完成)
});
使用时机:设定请求超时、只取最快回应的结果。