Day24 Promise

简介: Promise 是 JS 中进行异步编程的一种解决方案。
其他
<!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>

    <script>

        // 如何改变 Promise 的状态
        let p1 = new Promise((resolve, reject) => {
            //1. resolve 函数
            // resolve("ok"); // pending   => fulfilled (resolved)
            //2. reject 函数
            reject("error"); // pending  =>  rejected
            //3. 抛出错误
            // throw "出问题了";
        });



        // 一个 Promise 指定多个成功/失败回调函数, 都会调用吗?
        let p2 = new Promise((resolve, reject) => {
            resolve("OK"); //如果注释掉resolve(),那么p的状态就还是pending,即状态未发生改变,不会调用then
        });
        ///指定回调 - 1
        p2.then((value) => {
            console.log(value);
        });
        //指定回调 - 2
        p2.then((value) => {
            console.log(value);
        });



        // 改变 Promise 状态和指定回调函数谁先谁后?
        /*
            都有可能, 正常情况下是先指定回调再改变状态, 但也可以先改状态再指定回调
            如何先改状态再指定回调?
                在执行器中直接调用 resolve()/reject()
                延迟更长时间才调用 then()
            什么时候才能得到数据?
                如果先指定的回调, 那当状态发生改变时, 回调函数就会调用, 得到数据
                如果先改变的状态, 那当指定回调时, 回调函数就会调用, 得到数据
        */

        let startTime = Date.now()
        console.log("开始记时", startTime)
        let p3 = new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve("OK");
                let endTime = Date.now() - startTime
                console.log("结束记时", endTime)
            }, 1000);
        });
        p3.then(
            (value) => {
                console.log(value);
            },
            (reason) => { }
        );




        // Promise .then()返回的新 Promise 的结果状态由什么决定?
        /*
            如果onResolved方法返回非Promise对象,
                那么Promise .then()返回的新Promise的状态就为成功!
            如果onResolved方法为Promise对象,
                那么该Promise返回的状态(成功或者失败/resolve或reject)
                就决定了Promise .then()返回的新Promise的状态。
        */
        let p4 = new Promise((resolve, reject) => {
            resolve("ok");
            // reject("no");
        });
        //执行 then 方法
        let result = p4.then(
            (value) => {
                // console.log(value);
                //1. 抛出错误 rejected
                //   throw "出了问题";
                //2. 返回结果是非 Promise 类型的对象 fulfilled
                //   return 521;
                //3. 返回结果是 Promise 对象 fulfilled/rejected
                return new Promise((resolve, reject) => {
                    // resolve("success");
                    reject("error");
                });
            },
            (reason) => {
                console.warn(reason);
            }
        )
        console.log(result);
        // 这里result返回的依旧是一个Promise,以下是对Promise的成功或失败的处理
        result.then((value) => {
            console.log(value)
        }, (reason) => {
            console.log(reason)
        })





        // Promise 如何串连多个操作任务?
        /*
            通过 then 的链式调用串连多个同步/异步任务
        */
        let p5 = new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve('OK');
            }, 1000);
        });
        p5.then(value => {
            return new Promise((resolve, reject) => {
                resolve("success");
            });
        }).then(value => {
            console.log(value);
        }).then(value => {
            //因为上个then没有返回任何东西所以输出undefined
            console.log(value);
        })



        // Promise 异常传透?
        /*
            当使用 Promise 的 then 链式调用时, 可以在最后指定失败的回调
            前面任何操作出了异常, 都会传到最后失败的回调中处理
        */

        let p6 = new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve('OK');
                // reject('Err');
            }, 1000);
        });
        p6.then(value => {
            // console.log(111);
            throw '失败啦!';
        }).then(value => {
            console.log(222);
        }).then(value => {
            console.log(333);
        }).catch(reason => { //用then也可以捕获异常,不过then要传两个参数
            console.warn(reason);
        });
        console.log(p6)



        // 如何中断 Promise 链?
        /*
            当使用 Promise 的 then 链式调用时, 在中间中断, 不再调用后面的回调函数
            办法: 在回调函数中返回一个 pendding 状态的 Promise 对象
        */
        let p7 = new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve('OK');
            }, 1000);
        });
        let a = p7.then(value => {
            console.log(111);
            //有且只有一个方式
            return new Promise(() => {
            });
        }).then(value => {
            console.log(222);
        }).then(value => {
            console.log(333);
        }).catch(reason => {
            console.warn(reason);
        });

    </script>

</head>

<body>

</body>

</html>
async 和 await
<!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>

    <script>

        /*
            async 函数:
                使用async该函数的返回值为 Promise对象
                Promise对象的结果由 async 函数执行的返回值决定
        
        */
        async function main() {
            //1. 如果返回值是一个非Promise类型的数据 则状态为成功,返回一个成功的promise对象
            return 521;
        }
        async function main1() {
            //2. 如果返回的是一个Promise对象 则状态取决于返回结果
            return new Promise((resolve, reject) => {
                // resolve('OK'); //成功
                reject("Error"); //失败
            });
        }
        async function main2() {
            // 3. 抛出异常 返回一个失败的promise对象
            throw "Oh NO";
        }
        let result = main();
        let result1 = main1();
        let result3 = main2();
        console.log(result);
        console.log(result1);
        console.log(result3);



        /*
            await 表达式:
                await 右侧的表达式一般为 Promise对象, 但也可以是其它的值
                如果表达式是 Promise对象, await 返回的是 Promise成功的值
                如果表达式是其它值, 直接将此值作为 await 的返回值

                await 必须写在 async 函数中, 但 async 函数中可以没有 await
                如果 await 的 Promise失败了, 就会抛出异常, 需要通过 try…catch 捕获处理
        */

        async function main3() {
            let p = new Promise((resolve, reject) => {
                resolve("OK");
                // reject("Error");
            });
            //1. 右侧为promise的情况
            // let res = await p;
            //2. 右侧为其他类型的数据
            // let res2 = await 20;
            //3. 如果promise是失败的状态
            try {
                let res3 = await p;
                console.log(res3)
            } catch (e) {
                //catch捕获失败状态
                console.log(e);
            }
        }



    </script>

</head>

<body>

</body>

</html>
目录
相关文章
|
7月前
|
前端开发 API 容器
说说你对 promise 的了解
说说你对 promise 的了解
40 0
|
27天前
|
前端开发 JavaScript
Promise 的详解
总的来说,Promise 为处理异步操作提供了强大而灵活的工具,使代码更具可读性和可维护性,是现代 JavaScript 中不可或缺的一部分。
|
4月前
|
前端开发 JavaScript
Promise相关的理解
总之,Promise 是现代 JavaScript 异步编程的基石。它们提供了一种优雅的方式来处理异步操作,易于读写和维护,还可以通过其方法来控制复杂的异步流程。
61 5
|
6月前
|
前端开发
|
7月前
|
前端开发
对Promise的理解
对Promise的理解
52 2
|
存储 JSON 前端开发
深入使用 Promise
前面各种铺垫已经好了,现在我们一起来用一用Promise!
79 0
|
前端开发 JavaScript
深入理解Promise
深入理解Promise
92 0
|
前端开发 JavaScript
Promise使用详解
JS查漏补缺系列是我在学习JS高级语法时做的笔记,通过实践费曼学习法进一步加深自己对其的理解,也希望别人能通过我的笔记能学习到相关的知识点。这一次我们来了解Promise使用详解
106 0
|
前端开发 数据库
promise的介绍
promise的介绍
108 0
|
前端开发 API
对promise的一点了解
所谓 Promise,就是一个对象,用来传递异步操作的消息。它代表了某个未来才会知道结果的事件(通常是一个异步操作),并且这个事件提供统一的 API,可供进一步处理。
115 0