Promise学习

171 阅读1分钟

Promise学习

网络请求中的回调地狱

请求之中套请求

定时器的异步事件

<!DOCTYPE html>
<html lang="en">

    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
    </head>

    <body>

        <script>
            // 1. 使用setTimeOut
            // setTimeout(() => {
            //     console.log('Hello');
            // }, 1000);

            // 参数->函数
            // resolve, reject本身也是函数
            // new Promise((resolve, reject) => {
            //     setTimeout(() => {
            //         console.log('Hello');
            //         console.log('Hello');
            //         console.log('Hello');

            //         setTimeout(() => {
            //             console.log('Hello JS');
            //             console.log('Hello JS');
            //             console.log('Hello JS');

            //             setTimeout(() => {
            //                 console.log('Hello python');
            //                 console.log('Hello python');
            //                 console.log('Hello python');
            //             }, 1000);
            //         }, 1000);
            //     }, 1000);
            // })

            new Promise((resolve, reject) => {
                // 第一次网络请求的代码
                setTimeout(() => {
                    resolve();
                })
            }).then(() => {
                // 针对第一次网络请求结果处理的代码
                console.log('Hello');
                console.log('Hello');
                console.log('Hello');

                return new Promise((resolve, reject) => {
                    // 第二次网络请求的代码
                    setTimeout(() => {
                        resolve();
                    })
                })
            }).then(() => {
                // 针对第二次网络请求结果处理的代码
                console.log('Hello JS');
                console.log('Hello JS');
                console.log('Hello JS');

                return new Promise((resolve, reject) => {
                    // 第三次网络请求的代码
                    setTimeout(() => {
                        resolve();
                    })
                })
            }).then(() => {
                // 针对第三次网络请求结果处理的代码
                console.log('Hello python');
                console.log('Hello python');
                console.log('Hello python');
            });

            new Promise((resolve, reject) => {
                setTimeout(() => {
                    resolve('Hello World');
                    reject('error message');
                }, 2000);
            }).then((data) => {
                console.log(data);
            }).catch(err => {
                console.log(err);
            })
        </script>
    </body>

</html>

Promise的三种状态

  • pending: 等待状态,比如正在进行网络请求,或者定时器没有到时间
  • fulfill: 满足状态,当我们主动回调了resolve时,就处于该状态,并且会回调.then()
  • reject: 拒绝状态,当我们主动回调了reject时,就处于该状态,并且会回调.catch()

Promise的另外一种写法

<script>
    new Promise((resolve, reject) => {
        setTimeout(() => {

        }, 1000)
    }).then(function(data) {

    }, function(err) {

    })
</script>

Promise的链式调用

优雅的处理异步

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

    <script>
        // 网络请求:aaa -> 自己处理(10行)
        // 处理: aaa 111 -> 自己处理(10行)
        // 处理 aaa 111 222 -> 自己处理


        new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve('aaa');
            }, 1000);
        }).then(res => {
            console.log(res, '第一层的十行处理代码');

            // 对结果进行第一次处理
            return new Promise((resolve, reject) => {
                resolve(res + '111');
            });
        }).then(res => {
            console.log(res, '第二层的十行处理代码');

            return new Promise(resolve => {
                resolve(res + '222');
            })
        }).then(res => {
            console.log(res, '第三层的十行代码处理');
        })


        // 简洁写法
        new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve('aaa');
            }, 1000);
        }).then(res => {
            console.log(res, '第一层的十行处理代码');

            // 对结果进行第一次处理
            return Promise.resolve(res + '111');
        }).then(res => {
            console.log(res, '第二层的十行处理代码');

            return Promise.resolve(res + '222');
        }).then(res => {
            console.log(res, '第三层的十行代码处理');
        })

        // 再简洁写法
        new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve('aaa');
            }, 1000);
        }).then(res => {
            console.log(res, '第一层的十行处理代码');

            // 对结果进行第一次处理
            return res + '111';
        }).then(res => {
            console.log(res, '第二层的十行处理代码');

            return res + '222';
        }).then(res => {
            console.log(res, '第三层的十行代码处理');
        }).catch(err => {
            console.log(err);
        })
    </script>
</body>

</html>

Promise的all方法

当所有的请求都返回的时候再进行数据的处理

Promise.all([请求1, 请求2]).then(results => {
    results[0], 
    results[1]
})
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        const request1 = new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve('request1 data');
            }, 2000);
        })

        const request2 = new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve('request2 data');
            }, 1000)
        })

        Promise.all([request1, request2]).then(results => {
            console.log(results[0]);
            console.log(results[1]);
        })
    </script>
</body>

</html>