在现代 JavaScript 开发中,异步编程是一个不可或缺的部分。无论是处理网络请求、文件操作还是其他耗时的任务,异步编程都能帮助我们提高代码的效率和响应性。而 Promise
,作为一种强大的异步编程工具,已经成为 JavaScript 中处理异步操作的标准方式。
什么是 Promise?
从语法上讲,Promise
是一个对象,从它可以获取异步操作的消息。从本意上讲,它是承诺,承诺它过一段时间会给你一个结果。Promise
有三种状态:
Pending(等待态):初始状态,既不是成功,也不是失败。
Fulfilled(成功态):操作成功完成。
Rejected(失败态):操作失败。
状态一旦改变,就不会再变。创建 Promise
实例后,它会立即执行。
Promise 的基本用法
下面是一个简单的示例,展示如何使用 Promise
来处理异步操作。
<body>
<div>test</div>
<button onclick="test()">click me</button>
<script>
// 创建一个 Promise 对象
let promise = new Promise((res, rej) => {
// 定义一个条件变量
// 这里给定了一个固定的值, 条件以实际 情况为准
let condition = true;
if (condition) {
// 如果条件成立,调用 resolve 函数,并传递一个字符串作为数据
res("条件成立走这条路");
} else {
// 如果条件不成立,调用 reject 函数,并传递一个字符串作为错误信息
// 可以 修改 condition 值 为 false
rej("条件不成立走这条");
}
});
// 定义一个函数,当按钮被点击时调用
function test() {
// 调用 Promise 的 then 方法来处理成功的情况
promise.then((res) => {
// 打印 Promise 成功时传递的数据
console.log(res);
// 返回一个新的字符串,这个字符串将被传递给下一个 then
return "这个是第一个then 返回的数据";
}).then((res) => {
// 打印第一个 then 返回的数据,并在其后追加字符串 "11"
console.log(res + "11");
}).catch((err) => {
// 如果 Promise 被 reject,或者在 then 的回调函数中抛出异常,catch 会捕获到错误
console.log(err);
});
}
</script>
</body>
代码解析
创建 Promise 对象:
let promise = new Promise((res, rej) => { let condition = true; if (condition) { res("条件成立走这条路"); } else { rej("条件不成立走这条"); } });
new Promise((res, rej) => { ... })
:创建一个新的Promise
对象。let condition = true
:定义一个条件变量,用于决定Promise
的状态。res("条件成立走这条路")
:如果条件成立,调用resolve
函数,并传递一个字符串作为数据。rej("条件不成立走这条")
:如果条件不成立,调用reject
函数,并传递一个字符串作为错误信息。
处理 Promise
function test() { promise.then((res) => { console.log(res); return "这个是第一个then 返回的数据"; }).then((res) => { console.log(res + "11"); }).catch((err) => { console.log(err); }); }
promise.then((res) => { ... })
:调用Promise
的then
方法来处理成功的情况。console.log(res)
:打印Promise
成功时传递的数据。return "这个是第一个then 返回的数据"
:返回一个新的字符串,这个字符串将被传递给下一个then
。console.log(res + "11")
:打印第一个then
返回的数据,并在其后追加字符串 "11"。catch((err) => { console.log(err) })
:捕获任何在Promise
链中发生的错误,并打印错误信息。
输出结果
假设 condition
为 true
,点击按钮后,控制台的输出将是:
条件成立走这条路
这个是第一个then 返回的数据11
如果 condition
为 false
,点击按钮后,控制台的输出将是:
条件不成立走这条
Promise 的优势
更好的错误处理:
Promise
提供了统一的错误处理机制,通过catch
方法可以捕获整个Promise
链中的错误。
链式调用:
Promise
支持链式调用,使得代码更加简洁和易读。
避免回调地狱:
传统的回调方式容易导致回调地狱(Callback Hell),而
Promise
可以有效避免这种情况,使代码更加清晰。