前端学习编写的实例
kangkai
2021-04-09 a22077b849d95f154324c8c516765ab729dd23ed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
<html>
    <head>        
        <title>Promise</title>        
        <script type='text/javascript'>
            //1.链式回调 通过多次调用 then() 可以添加多个回调函数,它们会按照插入顺序进行执行。
            const doSomething = () => new Promise((resolve,reject)=>{setTimeout(() => {
                console.log("在setTimeout中做了些事");
                reject();
            }, 10);});
            const successCallBack = () => {
                console.log("成功的回调");
            };
            const successCallBack1 = () => new Promise((resolve,reject)=>{setTimeout(() => {
                console.log("成功的回调1");
                reject();
            }, 10);});
            const failureCallBack = () => {
                console.log("失败的回调");
            }; 
            //返回Promise对象,输出"在setTimeout中做了些事"文本,但是没有执行reject回调。
            const promise = doSomething();
            //执行promise对象的reject回调failureCallBack(),输出“失败的回调”文本,返回promise2对象,由于failureCallBack()方法中没有手动创建Promise所以这里返回的是默认的Promise对象
            const promise2 = promise.then(successCallBack,failureCallBack);
            //执行promise2默认回调successCallBack(),返回默认对象promise3
            const promise3 = promise2.then(successCallBack,failureCallBack);
            //简写
            doSomething().then(successCallBack,failureCallBack).then(successCallBack,failureCallBack);
            //successCallBack1返回用户自己创建的Promise,并且指定了回调函数
            doSomething().then(successCallBack,failureCallBack).then(successCallBack,failureCallBack).then(successCallBack1,failureCallBack).then(successCallBack,failureCallBack);
 
            //.catch()、finally()
            const promise4 = new Promise((resolve,reject)=>{setTimeout(() => {
                console.log("promise4:在setTimeout中做了些事");                
                console.log("选择路径[A]");
                resolve("路径:A0");
                //reject("路径:A1");
            },10)})
            .then(resolvePara => new Promise((resolve2,reject2) => {
                console.log("promise4 then1:成功的回调");
                throw new Error("是错误哦");
                console.log(resolvePara);
                console.log("选择路径[B]");                
                resolve2(resolvePara + " B0");
                //reject2(resolvePara + " B1");
            }), rejectPara => new Promise((resolve2,reject2) => {
                console.log("promise4 then1:失败的回调");
                console.log(rejectPara);
                console.log("选择路径[B]");
                resolve2(resolvePara + " B0");
                //reject2(resolvePara + " B1");
            }))
            .then(resolvePara => new Promise((resolve3,reject3) => {
                console.log("promise4 then1 then2:成功的回调");
                console.log(resolvePara);
                console.log("选择路径[C]");                
                resolve3(resolvePara + " C0");
                //reject3(resolvePara + " C1");
            }), rejectPara => new Promise((resolve3,reject3) => {
                console.log("promise4 then1 then2:失败的回调");
                console.log(rejectPara);
                console.log("选择路径[C]");
                resolve3(resolvePara + " C0");
                //reject3(resolvePara + " C1");
            }))
            .catch(rejectPara => {
                console.log("promise4 catch:异常的回调");
                console.log(rejectPara);
            })
            .finally(() => {                
                console.log("promise4 finally:执行完毕");
            })
            //通常,一遇到异常抛出,浏览器就会顺着 Promise 链寻找下一个 onRejected 失败回调函数或者由 .catch() 指定的回调函数。
            //finally不管成功失败都会执行内部代码,不接受参数。
 
 
            //2.在本轮 事件循环 运行完成之前,回调函数是不会被调用的。
            console.log("在本轮 事件循环 运行完成之前,回调函数是不会被调用的,你看我是最先执行的");
            //3.即使异步操作已经完成(成功或失败),在这之后通过 then() 添加的回调函数也会被调用。
            const promise5 = new Promise((resolve)=>{
                setTimeout(()=>{
                    console.log("promise5 执行的异步操作");
                    resolve();
                },10);
            });
            setTimeout(()=>{
                promise5.then(() => {
                    console.log("promise5 即使异步操作已经完成(成功或失败),在这之后通过 then() 添加的回调函数也会被调用");
                });
            },1000);
            //3.
        </script>
    </head>
    <body>
 
    </body>
</html>