Promise 是 JavaScript 中用于处理异步操作的对象,它代表了一个异步操作的最终完成(或失败)及其结果值。Promise 可以处于以下三种状态之一:
.catch()
方法来捕获和处理异步操作中的错误。.then()
方法链式调用多个异步操作,使代码更加清晰和易于管理。Promise.all()
并行执行多个异步任务。.catch()
统一处理所有异步操作的错误。// 创建一个 Promise
const myPromise = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('成功!');
}, 1000);
});
// 使用 .then() 处理成功情况
myPromise.then((result) => {
console.log(result); // 输出: 成功!
});
// 使用 .catch() 处理失败情况
myPromise.catch((error) => {
console.error(error);
});
// 链式调用
myPromise
.then((result) => {
console.log(result); // 输出: 成功!
return '下一个操作';
})
.then((nextResult) => {
console.log(nextResult); // 输出: 下一个操作
})
.catch((error) => {
console.error(error);
});
// 并发执行多个 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"]
});
原因:可能是因为在 Promise 构造函数中没有调用 resolve
或 reject
。
解决方法:确保在适当的时候调用 resolve
或 reject
。
new Promise((resolve, reject) => {
// 确保在这里调用 resolve 或 reject
if (/* 成功条件 */) {
resolve('成功!');
} else {
reject('失败!');
}
});
原因:如果在链式调用中某个 .then()
没有返回 Promise 或者没有正确处理错误,后续的 .catch()
可能无法捕获到错误。
解决方法:确保每个 .then()
都返回一个 Promise,并且在链的末尾添加 .catch()
来捕获所有错误。
myPromise
.then((result) => {
console.log(result);
return anotherPromise; // 确保返回一个 Promise
})
.then((nextResult) => {
console.log(nextResult);
})
.catch((error) => {
console.error(error); // 捕获所有错误
});
原因:如果 Promise.all()
中的任何一个 Promise 被拒绝,整个 Promise.all()
会立即被拒绝。
解决方法:可以使用 Promise.allSettled()
来处理这种情况,它会等待所有 Promise 都解决或拒绝后再返回结果。
Promise.allSettled([promise1, promise2, promise3]).then(results => {
results.forEach(result => {
if (result.status === 'fulfilled') {
console.log('成功:', result.value);
} else {
console.error('失败:', result.reason);
}
});
});
通过这些方法和示例代码,可以更好地理解和使用 Node.js 中的 Promise。
领取专属 10元无门槛券
手把手带您无忧上云