vue学习之promise

1、认识promise

1.1、做什么

异步编程的一种解决方案

1.2、何时处理异步事件

  • 网络请求(比如 3+7=10 不能将结果返回)
  • 网络请求中传入另外一个函数,数据请求成功时候,将数据传入的函数回调处理

1.3、回调地狱

1.3.1、需求说明

需要通过url1从服务器加载数据data1,data1包含下一个请求url2
需要通过url2从服务器加载数据data1,data1包含下一个请求url3
需要通过url2从服务器加载数据data1,data1包含下一个请求url4

1.3.2、伪代码

$.ajax('url1',function(data1){
    $.ajax(data1['url2'],function(data2){
        $.ajax(data2['url3'],function(data3){
            $.ajax(data3['url4'],function(data4){
                console.log(data4);
            })
        })
    })
})

1.3.3、代码出现的问题

  1. 正常情况,不会有问题,可以获取想要的结果
  2. 这样代码难看不移维护
  3. 希望优雅的方式进行异步操作

1.3.4、如何做

promise可以以一种优雅方式解决这种问题

2、promise基本使用

2.1、定时器的异步事件

需求说明

使用定时器模拟异步事件

  • 假设下面data是从网络上一秒后请求的数据
  • console.log就是我们的处理凡是

这个例子感觉我们有点多余

  • 首先promise代码明显比上面代码复杂
  • 其次promise包含resole,reject,then,catch什么东西

代码

<!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>
        // 说明
        // Promise有两个参数 resole reject 表示成功时调用  失败时调用的函数
        // 调用resole函数时  会将数据传入.then方法里面
        // 调用reject函数时 会将数据传入.catch方法里面
        new Promise((resolve, reject) => {
            setTimeout(() => {
                // resolve('hello world');
                reject('hello vuejs')
            }, 1000);
        }).then((data) => {
            console.log(data)
        }).catch((error) => {
            console.log(error)
        })
    </script>
</body>

</html>

另外处理形式

<!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>
        new Promise((resolve, reject) => {
            setTimeout(() => {
                // resolve('hello vuejs')
                reject('hello js')
            }, 1000);
        }).then((data) => {
            console.log(data)
        }, error => {
            console.log(error)
        })
    </script>
</body>

</html>

效果图

请添加图片描述

2.2、定时器的异步解析

  • new Promise创建一个Promise对象
  • ((resole,reject) => {}) 是一个函数,箭头函数
    • resole,reject也是两个函数,请求成功和失败决定调用哪一个
  • 成功还是失败
    • 成功,调用resolve(message),then被调用
    • 失败,调用reject(message),catch被调用

2.3、promise的三种状态

pending
等待状态,比如正在进行网络请求,或者定时器没有到时间
fulfill
满足状态,当我们主动回调resolev,处于该状态 回调then
reject
拒绝状态,当主动调用reject,处于该状态,回调catch

3、promise链式调用

3.1、流程

版本1

<!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>
        new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve('hello vuejs')
            }, 1000)
        }).then(data => {
            console.log(data)
            return new Promise((resolve, reject) => {
                setTimeout(() => {
                    resolve('hello js')
                }, 1000);
            }).then(data => {
                console.log(data)
                return new Promise((resolve, reject) => {
                    setTimeout(() => {
                        resolve('hell java')
                    }, 1000);
                }).then(data => {
                    console.log(data)
                })
            })
        })

    </script>
</body>

</html>

版本2

<!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>
        new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve('hello vuejs')
            }, 1000)
        }).then(data => {
            console.log(data)
            return Promise.resolve(data + 1)
        }).then(data => {
            console.log(data)
            return Promise.resolve(data + 2)
        }).then(data => {
            console.log(data)
            return Promise.resolve(data + 3)
        }).then(data => {
            console.log(data)
        })

    </script>
</body>

</html>

效果图

在这里插入图片描述

说明

这里直接通过Promise包装了一下新的数据,将promise对象返回

  • promise.resolve():将数据包装成promise对象,并且在内部回调resolve函数
  • promise.reject():将数据包装成promise对象,内部回调reject函数在·

版本3

<!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>
        new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve('hello vuejs')
            }, 1000)
        }).then(data => {
            console.log(data)
            return data + 1
        }).then(data => {
            console.log(data)
            return data + 2
        }).then(data => {
            console.log(data)
            return data + 3
        }).then(data => {
            console.log(data)
        })

    </script>
</body>

</html>

关键代码

在这里插入图片描述

效果图

在这里插入图片描述

说明

如果希望将数据直接包装成Promise.resolve,那么在then中可以直接返回数据
return Promise.resolve(data) =》return data;

3.2、链式简写

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值