• 【Vue】Re19 Promise


    一、概述

    Promise是异步编程的解决方案

    异步事件的处理:

    封装的异步请求函数不能立即获取结果,

    通常会传入另外一个函数,在请求成功的时候将数据通过传入的函数回调出去

    如果只是一个简单的请求,那么这种方案非常的麻烦

    但是,如果请求非常复杂的时候,就会出现回调地狱

    <script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
    <script type="text/javascript">
        $(function(){
            // todo ... 开始写 jQuery 代码...
            $.ajax('url-link or api-address', function (data1) {
                $.ajax('url-link or api-address', function (data2) {
                    $.ajax('url-link or api-address', function (data3) {
                        $.ajax('url-link or api-address', function (data4) {
                            console.log(data4);
                        })
                    })
                })
            });
        });
    </script>

    二、语法样例:

        /* 链式编程警告 !!!!  */
    
        /* 构造参数是一个函数 入参函数本身 包括两个参数, 解析 与 拒绝 */
        /* resolve, reject 也是函数。。。 */
        new Promise((resolve, reject) => {
            setTimeout(() => { /* 模拟第一次的异步请求 */
                resolve(); // 调用 resolve 会直接跳转到下面的then函数执行
            }, 1000);
        }).then(() => { /* 第一次得到data结果的处理逻辑 */
            console.log('request01 executed...');
            console.log('request01 executed...');
            console.log('request01 executed...');
    
            return new Promise((resolve, reject) => {
                setTimeout(() => { /* 第二次的异步请求 */
                    resolve();
                }, 1000);
            }).then(() => { /* 第二次得到data结果的处理逻辑 */
                console.log('request02 executed...');
                console.log('request02 executed...');
                console.log('request02 executed...');
    
                return new Promise((resolve, reject) => {
                    setTimeout(() => { /* 第三次的异步请求 */
                        resolve();
                    }, 1000);
                }).then(() => {
                    console.log('request03 executed...');
                    console.log('request03 executed...');
                    console.log('request03 executed...');
                });
            });
        });
        /* 上述代码可以看出我们的Promise结构就分为两部分,构造器参数的执行 和 then函数 */
        /* 构造器负责请求的发生, 而then函数负责响应数据的逻辑处理 */

    如果是响应失败的情况,再引用catch函数捕获处理:

        new Promise((resolve, reject) => {
            setTimeout(() => { /* 模拟第一次的异步请求 */
                resolve(); // 调用 resolve 会直接跳转到下面的then函数执行
            }, 1000);
        }).then(() => { /* 第一次得到data结果的处理逻辑 */
            console.log('request01 executed...');
            console.log('request01 executed...');
            console.log('request01 executed...');
    
            return new Promise((resolve, reject) => {
                setTimeout(() => { /* 第二次的异步请求 */
                    resolve();
                }, 1000);
            }).then(() => { /* 第二次得到data结果的处理逻辑 */
                console.log('request02 executed...');
                console.log('request02 executed...');
                console.log('request02 executed...');
    
                return new Promise((resolve, reject) => {
                    setTimeout(() => { /* 第三次的异步请求 */
                        resolve();
                    }, 1000);
                }).then(() => {
                    console.log('request03 executed...');
                    console.log('request03 executed...');
                    console.log('request03 executed...');
                }).catch(error => {
                    console.log(error);
                });
            }).catch(error => {
                console.log(error);
            });
        }).catch(error => {
            console.log(error);
        });

    三、Promise的三种状态

    Pending等待状态:

    请求进行中,定时器尚未到达触发时间

    Fullfill满足状态:

    主动回调resolve时,回调then函数

    Reject拒绝状态:

    主动回调rejec时t,回调执行catch函数

    四、All方法

    语法演示

    <!--<script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>-->
    <script src="./../../dependencies/jquery.min.js"></script>
    <script type="text/javascript">
    
        /* all方法注入的是一个数组 */
        Promise.all([
            new Promise((resolve, reject) => {
                $.ajax({
                    url : 'url',
                    success : data => {
                        resolve(data);
                    }
                })
            }),
            new Promise((resolve, reject) => {
                $.ajax({
                    url : 'url',
                    success : data => {
                        resolve(data);
                    }
                })
            }),
        ]).then(results => {
            console.log(results[0]);
            console.log(results[1]);
        });
    </script>

    案例:

    /* 方法注入的是一个数组 */
        Promise.all([
            new Promise((resolve, reject) => {
                setTimeout(() => {
                    resolve('result');
                }, 1000);
            }),
            new Promise((resolve, reject) => {
                setTimeout(() => {
                    resolve('result');
                }, 1000);
            }),
        ]).then(results => {
            console.log(results);
            console.log(results[0]);
            console.log(results[1]);
        });

    应用场景:同时发送两个以上的异步请求

  • 相关阅读:
    112.路径总和
    二叉树的中序遍历
    HTML基础及案例
    web概念概述
    Spring JDBC
    数据库连接池
    JDBC连接池&JDBCTemplate
    JDBC
    MySQL多表&事务
    DCL
  • 原文地址:https://www.cnblogs.com/mindzone/p/13913094.html
Copyright © 2020-2023  润新知