Promise
是JavaScript中用于处理异步操作的对象。它代表了一个尚未完成但预期将来会完成的操作。Promise
有三种状态:
- Pending(待定) : 初始状态,既不是成功,也不是失败状态。
- Fulfilled(已实现) : 意味着操作成功完成。
- Rejected(已拒绝) : 意味着操作失败。
创建 Promise
Promise
是通过其构造器创建的:
let promise = new Promise(function(resolve, reject) {
// 异步操作的代码
if (/* 异步操作成功 */) {
resolve(value); // 如果操作成功,调用 resolve 并传入 value
} else {
reject(error); // 如果操作失败,调用 reject 并传入 error
}
});
resolve
和 reject
是由JavaScript引擎提供的两个函数。当异步操作成功时,你应该调用 resolve(value)
;当操作失败时,应该调用 reject(error)
。
消费 Promise
一旦 Promise
被创建,你可以使用 .then()
, .catch()
, 和 .finally()
方法来处理它。
.then()
方法用于设置操作成功时的回调函数。.catch()
方法用于设置操作失败时的回调函数。.finally()
方法用于设置无论操作成功还是失败都会执行的回调函数。
promise
.then(function(result) {
// 处理成功情况
})
.catch(function(error) {
// 处理错误情况
})
.finally(function() {
// 总是会执行
});
链式调用
.then()
和 .catch()
方法都会返回一个新的 Promise
,允许它们被链式调用:
new Promise((resolve, reject) => {
setTimeout(() => resolve(1), 1000); // (*)
})
.then(function(result) { // (**)
console.log(result); // 1
return result * 2;
})
.then(function(result) { // (***)
console.log(result); // 2
return result * 2;
})
.then(function(result) {
console.log(result); // 4
return result * 2;
});
在这个例子中,第一个 .then()
处理 (*) 中的 resolve
,并在 (**) 中返回新的值。这个值被传递到链中的下一个 .then()
,以此类推。
错误处理
如果 .then()
或 .catch()
中抛出异常,Promise
将被拒绝,并将错误传递到下一个 .catch()
:
new Promise((resolve, reject) => {
throw new Error("错误!");
})
.then(function(result) {
// 不会被调用
})
.catch(function(error) {
console.log(error); // Error: 错误!
});
Promise.all
Promise.all
是一个实用函数,用于等待多个 Promise
对象完成:
Promise.all([
new Promise(resolve => setTimeout(() => resolve(1), 3000)),
new Promise(resolve => setTimeout(() => resolve(2), 2000)),
new Promise(resolve => setTimeout(() => resolve(3), 1000))
])
.then(results => {
console.log(results); // [1, 2, 3] 当所有 promise 完成时,结果是一个数组
});
在上面的示例中,Promise.all
等待所有传递的 Promise
完成,并将它们的结果作为数组返回。
注意事项
- 如果
Promise.all
中任何一个Promise
被拒绝,整个Promise.all
调用会立即被拒绝,不会等待其他Promise
完成。 - 使用
Promise
时要确保正确处理错误情况,以避免未捕获的异常。 Promise
的链式调用可以帮助你避免回调地狱(Callback Hell),使你的代码更加清晰易读。