[TOC]

前言: 回顾js的作用: 存储数据, 传输数据, 处理数据, 展示数据

1. 存储数据有哪些方式(套路)

var a = 222;  // 变量
var arr = [1,23,3]; // 数组
var obj = {name:'zs'}; // 对象
data-index=222        // 定义属性
// 读取数据的方式
console.log(a);
arr[0];
obj.name;
$(选择器).data('index');

2. 传输数据有哪些方式

(1)页面跳转
(2)函数调用
(3)调用接口: 把数据从服务器传输到前端

promise是用来存储数据, 它有它自己存和取的方式

promise是什么:

所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise 是一个对象,从它可以获取异步操作的消息。promise是异步编程的一种解决方案。

(一) 创建promise对象和存储数据

<script>
    // 创建promise对象
    var promiseObj = new Promise(function(resolve, reject) {
        // 2. 调用resolve把成功的数据存储到promise对象里
        resolve(222);
    });

    console.log('promiseObj', promiseObj);


    console.log('\n-----------------------')

    // 创建promise对象
    var promiseObj2 = new Promise(function(resolve, reject) {
        // 2. 调用reject把失败的数据存储到promise对象里
        reject('失败了');
    });

    console.log('promiseObj2', promiseObj2);

    console.log('\n-----------------------')

    // 创建promise对象
    var flag = false;
    var promiseObj3 = new Promise(function(resolve, reject) {
        if (flag) {
            resolve(222);
        } else {
            reject('失败了');
        }
    });

    console.log('promiseObj3', promiseObj3);
</script>

(二) 获取promise对象存储的数据

<script>
    var boo = false;
    var promseObj = new Promise(function(resolve, reject) {
        if (boo) {
            resolve({
                name: 'zs'
            });
        } else {
            reject({
                msg: '失败了'
            })
        }
    })


    // 获取promiseObj对象的数据,then获取成功的信息,catch获取失败的信息
    promseObj.then(function(result) {
        console.log(result);
    }).catch(function(error) {
        console.log(error);
    })
</script>

(三) 使用promise对象存储异步请求结果

<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<script>
    // 1. new一个promise对象
    var promiseObj = new Promise(function(resolve, reject) {
        $.ajax({
            url: 'http://huruqing.cn:3000/api/film/getList',
            data: {},
            type: 'get',
            success(res) {
                resolve(res);
            },
            error: function(err) {
                reject(err);
            }
        })
    })


    // 2. 获取数据
    promiseObj.then(function(res) {
        console.log(res);
    }).catch(function(err) {
        console.log(err);
    })
</script>

(四) promise对象的三种状态

创建promise对象有三种状态

  • Pending 进行中,初始状态,既不是成功,也不是失败状态
  • Resolved(已完成,又称 Fulfilled)
  • Rejected(已失败) ```javascript

    
    <a name="HONJS"></a>
    ## (五) 配合async await使用可以使异步变同步
    <a name="tfp1t"></a>
    ### 1. async await 举例:  
    ```javascript
     // 1. 创建一个函数,在function前面加上async
        async function getData() {
            // 2. 创建一个promise对象,并存储数据
            var promiseObj = new Promise(function(resolve, reject) {
                    setTimeout(function() {
                        resolve({
                            msg: 'success'
                        });
                    }, 2000)
                })
                // 3. 用await等待结果, 有了结果之后再执行 
            var result = await promiseObj;
            console.log(result);
        }
        getData();
    

    2. 使用函数返回promise对象

      // 项目中一般使用一个函数来返回一个promise对象
        function getObj() {
            var promiseObj = new Promise(function(resolve, reject) {
                setTimeout(function() {
                    resolve({
                        msg: 'success'
                    });
                }, 2000)
            })
            return promiseObj;
        }
    
        async function getData2() {
              // 调用getObj()得到一个promise对象, 使用await等待它结果
            var result = await getObj();
            console.log(result);
        }
    

    (六) promise配合async await的好处: 可以避免回调地狱

    1. 回调函数, 回调地狱是什么

    2. 使用async await解决回调地狱

     // async await应用,可以避免过多的回调函数(俗称回调地狱), 下面是使用async await对上面代码进行改造
        // 1. 封装ajax方法
        function getData(url, data) {
            // 2.使用promise对象存储请求结果
            var promiseObj = new Promise(function(resolve, reject) {
                $.ajax({
                    url: url,
                    data: data,
                    type: 'get',
                    dataType: 'json',
                    success: function(res) {
                        resolve(res);
                    },
                    error: function(err) {
                        reject(err);
                    }
                })
            })
            return promiseObj;
        }
    
        // 2.获取电影详情
        async function getDetail() {
            // (1).请求电影列表
            var url = 'http://huruqing.cn:3000/api/film/getList';
            var data = {};
            var result1 = await getData(url, data);
            // 查找流浪地球的那部电影
            var filmList = result1.films;
            var film = filmList.find(function(item) {
                return item.name === '流浪地球';
            });
    
            // (2).请求电影详情 
            var url = 'http://huruqing.cn:3000/api/film/getDetail';
            var data = {
                filmId: film.filmId
            };
            var result2 = await getData(url, data);
            console.log('流浪地球的详情是:', result2);
        }
        getDetail();
    

    (七) promise.all可以使多个请求结果都返回后再处理

    //     请求参数为1个数组,数组的成员为promise独享
    promise.all([promise1,promise2,promise3]);
    
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
    <script>
        // 1.创建二个promise对象
        // 2. 使用promise.all获取二个promise对象存储的值
    
        var promiseObj1 = new Promise(function(resolve, reject) {
            setTimeout(function() {
                resolve({
                    name: '张三',
                    age: 18
                });
            }, 1000)
        })
        var promiseObj2 = new Promise(function(resolve, reject) {
            setTimeout(function() {
                resolve({
                    name: '李四',
                    age: 22
                });
            }, 3000)
        })
    
        // 参数是一个数组, 数组的成是promise对象,Promise.all也是promise对象
        Promise.all([promiseObj1, promiseObj2]).then(function(res) {
            console.log(res);
        }).catch(function(err) {
            console.log(err)
        });
    </script>