04 Promise的理解(Ajax)

简介: Promise的理解(Ajax)

一、Promise是什么?

Promise,英文是许诺的意思,在Ajax中可理解为一件没有完成的事情,但是一定有结果的。

Promise是用来解决回调地狱问题的。

详情看下面的例子(类似于这种层层嵌套的语法结构我们称作为回调地狱)

ab0f3a2ce5ab4488962f3ab5a0233059.png

d145211802904881b1237ec0c82a2784.png

代码的层级开始层层递减这样的结构我们称之为回调地狱(层级多不方便修改与维护,看起来也难受)

为了解决这种回调地狱的问题,因此引入了Promise

结构如下:

5035e64a870145fc831dbf94bd547e9f.png

控制台查看,这样与第一种结果是一样的,但是这样写代码更加美观与可控性

a0d28b2b443d4c82aff864767599c384.png

如何解决的?

本质上来说是将第一次调用的返回值作为下次的调用者来用

二、Promise语法

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // 流程:1.创建实例对象
        const p = new Promise((resolve, reject) => {
            setTimeout(() => {
                if (1 > 0) {
                    resolve('ok')
                } else {
                    reject('not')
                }
            }, 1000)
        })
        // 2.调用实例化对象,成功输出1/ok,错误输出2/not
        p.then(res => {
            console.log(res);
            console.log(1);
        }, err => {
            console.log(err);
            console.log(2);
        })
    </script>
</body>
</html>


控制台查看,上面对了走resolve(),输出的ok1,如果上面if判断错误则走reject()err输出not2086be8c8e7274024b9f1fa9cc8ae7dd0.png

1.Promise的catch方法(捕获promise失败的时候的操作)

301aff230e6c494b90f7a672302c886f.png

比如看这里,没有执行21行的代码,会直接直接下面错误的catch里面的函数

2.Promise中all与race方法

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script src="https://cdn.jsdelivr.net/npm/axios@0.27.2/dist/axios.min.js"></script>
    <script>
        const p1 = axios.get('http://ajax-api.itheima.net/api/province')
        const p2 = axios.get('http://ajax-api.itheima.net/api/city?pname=湖北省')
        const p3 = axios.get('http://ajax-api.itheima.net/api/area?pname=湖北省&cname=武汉市')
        // all方法:把多个promise方法合并成为一个promise对象 
        const pAll = Promise.all([p1, p2, p3])
        pAll.then(res => {
            // 对象是个数组,数组中的每一个元素就是promise的结果。
            // 利用了数组的有序性
            console.log(res);
        })
        /* race方法:也是多个合并成为一个promise,数组里面的任意一个promise
        执行完了就会执行那一个,其他的不执行 */
        const pRace = Promise.race([p1, p2, p3])
        pRace.then(res => {
            console.log(res);
        })
    </script>
</body>
</html>

控制台查看:

83fd4dfb6cf74d0484dcfb4b4ccda733.png

all方法是获取了全部的Promise并且一起装进了一个对象数组中,而race方法更像是比较网速,先获取到哪一个Promise就输出哪一个Promise。

三、Promise工作原理

Promise对象有三种状态:

①pending进行中:一创建Promise,默认状态就是pending状态,会立刻执行promise状态

1f99817ad9784db99894e490b7cf2ed2.png

②fufilled成功状态:当我传值进去,如果是resolve则,Promise的状态将会从pending转换成fufilled状态(成功状态)b5378c73c9a64da4b1227e6fbcec50ea.png

③rejected失败状态:如果是resolve则,Promise的状态将会从pending转换成rejected状态(失败状态)

c11ca451a9834fc1a6c883f53ec82d39.png

核心要点:

Promise是ES6新增的一个语法,是用来解决回调地狱的问题。

Promise的状态变化只有两种:

如果异步操作成功一般会执行resolve()方法,Promise的状态将会从pending转换成fufilled状态(成功状态)。

当异步操作失败的时候会执行reject()方法,Promise的状态将会从pending转换成rejected状态(失败状态)

相关文章
|
4月前
|
前端开发
用Promise对象实现的 Ajax
用Promise对象实现的 Ajax
30 0
|
4月前
|
存储 前端开发
PROMISE解决AJAX中的串行和并行
PROMISE解决AJAX中的串行和并行
46 0
|
4月前
|
前端开发 Java
Promise--代码实现-- ajax 传统方式和 promise 方式和 promise 代码优化/重排 方式的对比--综合代码示例
Promise--代码实现-- ajax 传统方式和 promise 方式和 promise 代码优化/重排 方式的对比--综合代码示例
47 0
|
4月前
|
前端开发 API
用promise封装ajax
用promise封装ajax
38 0
|
10月前
|
前端开发 JavaScript API
Promise封装Ajax请求
Promise封装Ajax请求
46 0
|
存储 前端开发
Promise 解决AJAX中的串行并行
Promise 是个好东西!
102 0
|
XML JSON 前端开发
Ajax、Promise、Axios前端三剑客
Ajax、Promise、Axios前端三剑客
|
JSON 前端开发 JavaScript
【JavaScript】Promise(一) —— 理解和使用(是什么、怎么使用、与 Ajax 配合使用、涉及的API)
【JavaScript】Promise(一) —— 理解和使用(是什么、怎么使用、与 Ajax 配合使用、涉及的API)
|
前端开发
ES6 从入门到精通 # 18:使用 Promise 封装 ajax
ES6 从入门到精通 # 18:使用 Promise 封装 ajax
126 0
ES6 从入门到精通 # 18:使用 Promise 封装 ajax
|
4月前
|
前端开发 JavaScript
如何处理 JavaScript 中的异步操作和 Promise?
如何处理 JavaScript 中的异步操作和 Promise?
53 1