JavaScript教程-JavaScript Promise
在现实生活中,承诺是人与人之间的信任,表示一定会发生某事。在 JavaScript 中,Promise 是一种对象,用于在将来的某个时间点产生一个单一的值(在需要时)。Promise 用于管理和处理异步操作。
JavaScript Promise 的必要性
之前我们学习了使用事件和回调函数来处理数据。然而,这种方式的应用范围有限。原因是事件无法有效地管理和处理异步操作。因此,Promise 是一种更简单、更好的处理异步操作的方法。
Promise 和事件处理程序之间存在两个主要区别:
- Promise 永远不会多次失败或成功。它只能发生一次。
- Promise 无法从成功切换到失败,也无法从失败切换到成功。如果 Promise 已经成功或失败,然后稍后如果添加了任何成功/失败回调,正确的回调将被调用,无论之前发生了什么事件。
Promise 的术语
Promise 可以处于以下几种状态之一:
- 待定(pending): Promise 既未被拒绝也未被解决。
- 已解决(fulfilled): Promise 相关操作成功完成。
- 被拒绝(rejected): Promise 相关操作未能成功完成。
- 已完成(settled): 不管操作是被解决还是被拒绝,都被视为已完成。
因此,Promise 表示异步操作的完成情况及其结果。它可以是成功完成的 Promise,也可以是失败的 Promise,但最终会完成。Promise 使用 then()
方法,在 Promise 解析完成后执行。
Promise 的方法
Promise 的方法几乎适用于所有主流网络浏览器(如 Chrome、Mozilla、Opera 等)。以下是一些常用的方法:
方法名 | 概要 |
---|---|
Promise.resolve(promise) | 如果 promise.constructor==Promise,则返回一个 Promise。 |
Promise.resolve(thenable) | 从具有 then 方法的对象创建一个新的 Promise。 |
Promise.resolve(obj) | 使用对象解析一个 Promise。 |
Promise.reject(obj) | 使用对象拒绝一个 Promise。 |
Promise.all(array) | 返回一个 Promise,当数组中的每个项目都完成时,它被解决;如果数组中的项目未完成,则被拒绝。 |
Promise.race(array) | 如果数组中的任何项目立即完成,它就解决 Promise;如果数组中的任何项目立即被拒绝,它就拒绝 Promise。 |
Promise 的构造函数
new Promise(function(resolve, reject){}); | 这里,resolve(thenable) 表示 Promise 将通过 then() 解析。resolve(obj) 表示 Promise 将以对象完成。reject(obj) 表示 Promise 将以对象拒绝。 |
Promise 的实现示例
<!DOCTYPE html>
<html>
<head>
<h2>JavaScript Promise</h2>
</head>
<body>
<script>
var p = new Promise(function(resolve, reject) {
var x = 2 + 3;
if (x == 5)
resolve("已执行并成功解决");
else
reject("被拒绝");
});
p.then(function(fromResolve) {
document.write("Promise 是 " + fromResolve);
}).catch(function(fromReject) {
document.write("Promise 是 " + fromReject);
});
</script>
</body>
</html>
在上面的 Promise 实现示例中,Promise 构造函数接受一个回调函数作为参数。该回调函数有两个参数:
- Resolve(解析): 当 Promise 成功执行时,调用 resolve 参数,提供结果。
- Reject(拒绝): 当 Promise 被拒绝时,调用 reject 参数,引发错误。
这意味着要么调用 resolve,要么调用 reject。在此示例中,then()
方法接受一个参数,该参数将在 Promise 解析时执行。否则,如果 Promise 被拒绝,将调用 catch()
方法处理拒绝状态。
使用 Promise 的优势
- 更好的处理异步操作的选择。
- 提供了更简便的错误处理和更清晰的代码可读性。