Promise 概述
Promise 是 ES6 中新增的一个对象,通过 Promise 就可以实现,用 同步
的流程来表示异步的操作,通过 Promise 就可以避免回调函数层层嵌套(回调地狱)的问题。
MDN:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise
创建 Promise 对象
new Promise(function(resolve, reject){});
promise 对象不是异步的, 只要创建 promise 对象就会立即执行存放的代码:
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Demo</title>
<script>
console.log("1");
let promise = new Promise(function (resolve, reject) {
console.log("2");
});
console.log("3");
</script>
</head>
<body>
</body>
</html>
Promise 是如何实现通过同步的流程来表示异步的操作的, promise 对象是通过状态的改变来实现的, 只要状态发生改变就会自动触发对应的函数
Promise 对象三种状态
- pending:默认状态,只要没有告诉 promise 任务是成功还是失败就是
pending
状态
- fulfilled(resolved): 只要调用
resolve
函数, 状态就会变为fulfilled
, 表示操作成功
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Demo</title>
<script>
let promise = new Promise(function (resolve, reject) {
resolve();
});
console.log(promise);
</script>
</head>
<body>
</body>
</html>
- rejected: 只要调用
rejected
函数, 状态就会变为rejected
, 表示操作失败
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Demo</title>
<script>
let promise = new Promise(function (resolve, reject) {
reject();
});
console.log(promise);
</script>
</head>
<body>
</body>
</html>
注意点: 状态一旦改变既不可逆, 既从
pending
变为 fulfilled
, 那么永远都是 fulfilled
,既从 pending
变为 rejected
, 那么永远都是 rejected
监听 Promise 状态改变
我们还可以通过函数来监听状态的变化。
- resolved --> then()
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Demo</title>
<script>
let promise = new Promise(function (resolve, reject) {
resolve();
});
promise.then(function () {
console.log("then");
});
promise.catch(function () {
console.log("catch");
});
</script>
</head>
<body>
</body>
</html>
- rejected --> catch()
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Demo</title>
<script>
let promise = new Promise(function (resolve, reject) {
reject();
});
promise.then(function () {
console.log("then");
});
promise.catch(function () {
console.log("catch");
});
</script>
</head>
<body>
</body>
</html>