Promise
是 JavaScript 中的一个对象,代表了一个异步操作的最终完成或失败的结果。它允许您将回调从嵌套(或回调地狱)转移到更扁平、链式的调用方式。
以下是关于 Promise
的基础知识:
-
三种状态:
- Pending: 初始状态,既不是成功,也不是失败。
- Fulfilled: 意味着操作成功完成。
- Rejected: 意味着操作失败。
-
构造函数:
javascriptconst promise = new Promise((resolve, reject) => { if (/* 一些异步操作成功 */) { resolve('Success'); } else { reject('Failure'); } });
-
方法:
.then()
: 当 Promise 完成时,无论其是被解决还是被拒绝,都会执行该方法。.catch()
: 当 Promise 被拒绝时,该方法会被调用。.finally()
: 无论 Promise 被解决还是被拒绝,都会执行该方法。
javascriptpromise .then(result => { console.log(result); }) .catch(error => { console.log(error); }) .finally(() => { console.log('Promise settled'); });
-
静态方法:
Promise.resolve(value)
: 返回一个以给定值解析后的Promise
。Promise.reject(reason)
: 返回一个带有拒绝原因的Promise
。Promise.all(iterable)
: 当所有的Promise
都完成时,该方法返回一个新的Promise
。Promise.race(iterable)
: 返回一个Promise
,它在 iterable 中的任何一个Promise
完成或拒绝后,就立即使用该Promise
的值来解析或拒绝。
-
错误处理:
- 如果在
Promise
内部发生错误,并且没有处理(例如没有.catch()
),则该错误不会被捕获,而是会导致应用程序崩溃或"未捕获的 promise 异常"警告。
- 如果在
-
链式调用:
Promise
允许链式调用.then()
,这意味着一个.then()
可以返回另一个Promise
,这使得异步代码的组织和处理变得更加简洁。
Promise
提供了一种更优雅、可读性更强的方式来处理异步操作,而不是传统的回调函数方式。这是现代 JavaScript 中异步编程的核心概念之一,尤其在 ES6 和更高版本中。
注意: 如果Promise.all
中的任何一个Promise
失败(被reject
),那么Promise.all
本身会立即失败,并返回那个导致失败的Promise
的错误值。
换句话说,Promise.all
是"短路"的,只要其中一个Promise
失败,它就不会等待其他的Promise
,而是立即失败。
这里是一个简单的例子来说明这点:
javascript
let p1 = Promise.resolve("Success");
let p2 = new Promise((resolve, reject) => {
setTimeout(() => {
reject("Error from p2");
}, 1000);
});
let p3 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve("Success from p3");
}, 2000);
});
Promise.all([p1, p2, p3])
.then(values => {
console.log(values); // 这行不会执行
})
.catch(error => {
console.log(error); // 输出:"Error from p2"
});
在这个例子中,尽管p3
在2秒后会成功解决,但由于p2
在1秒后失败,Promise.all
会立即失败,并捕获到错误:"Error from p2"。
如果你想让所有的Promise
都执行完,不管它们是否失败,并收集它们的结果或错误,你可能想要使用Promise.allSettled
。这个API在所有的Promise
都定履行(不论fulfilled或rejected)之后,返回一个新的Promise
,它将解决为一个包含每个Promise
的结果对象的数组。