Promise/async/await 研究笔记

news/2024/11/15 15:16:37/文章来源:https://www.cnblogs.com/dint/p/18548026

Promise/async/await  是ES6里面的新特性   个人理解如下:

    1.创建Promise对象后会立即执行内部函数fn new Promise(fn);

1 new Promise(function(resolve, reject){
2          console('new 完后马上执行这个函数哦');
3      });

     2. Promise 可以通过resolve(r)返回结果 ,then函数接收结果   ,catch函数捕获 throw e 异常, reject(e) 手动触发catch调用

 1 function test1(){
 2         return new Promise(function(resolve, reject){
 3            window.setTimeout(function(){
 4               try{
 5                 //throw '抛出的异常222'; //这里抛出的异常外部promise不能 直接  catch 到哦 需内部自己捕获后调用 reject 传递到catch
 6                 
 7                 console.log('test1.....');
 8                 resolve('ooookkkk..'); //resolve 向下一个then传递结果
 9               
10               
11               }catch(e){
12                  reject(e); //向catch 传递结果
13               }
14               
15            },1000);
16            //throw '抛出的异常111'; //这里抛出的异常能直接被.catch() 捕获到哦  但是会使 setTimeout 里面的 resolve不再调用了哦
17         }).then(function(r){
18             console.log('调用 resolve 后会执行我哦');
19             console.log(r);
20         
21         }).catch(function(r){
22             console.log('调用 reject 或throw e后 后会执行我哦');
23             console.log(r);
24         });
25      }
26      
27     //let res1= test1(); // res1 是 Promise;
28     //console.log(res1);

    3.async 关键字修饰函数后  函数的返回值就是Promise对象  如果函数就return a ; 那么Promise对象的result=a;

 1 async function test3_(n){ //async return 会封装成 Promise 并把返回值 作为promise的result属性内容\
 2         
 3         window.setTimeout(function(){
 4               console.log(n);
 5               return n+100;
 6            },1000);
 7            if (n===3){
 8               throw '异常123';
 9            }
10            let a='返回string='+n;
11            return a;  //实际返回Promise(result=a);
12      }
13      
14      async function test3(){
15         let a= await test3_(1);  //这里的返回值是 函数的实际return 返回值 并不会等待里面的setTimeout完成
16         console.log(a);
17         let b=     test3_(2); //这里是 Promise 封装 里面封装了 return 返回值 作为result字段
18         console.log(b);
19         let c=      test3_(3).catch(function(r){console.log(r);});
20         console.log(c);
21         
22         let d=new Promise(function(a,b){
23            console.log('这样也可以直接执行哦');
24            return 'oookkkk'; //这里的返回意义不大
25         }).then(function(r){
26            console.log('成功了会执行我哦');
27         });
28         
29         console.log(d);
30      }
31      //test3();

 

   4.await  必须在async修饰的函数中使用

1 function test6(){
2         
3       }
4       function test7(){
5          let z=await test6();//这种写法是错误的  因为test6没有返回Promise对象
6       }

 

   5. await fn();   中    fn 如果返回值不是Promise 对象,  则和普通函数调用无异   

   

 1 function test5(){
 2          
 3          console.log('111111');
 4          window.setTimeout(function(){
 5             console.log('222222');
 6          },1000);
 7          return 33333;
 8       }
 9       async function test5_(){
10           let a=await test5(); //这个时候和普通调用无异 因为没有返回Promise对象
11           console.log(a);
12       }
13       test5_();

 

   6. await fn();  中    fn 如果返回Promise 对象  则等待Promise的result产生 后返回

 1 function test8(){
 2          return new Promise(function(resolve, reject){
 3             resolve('成功返回'); //如果没有then语句  result='成功返回';  
 4          }).then(function(r){
 5             return '这里优先作为结果'; //如果有这个返回  最终result='这里优先作为结果';
 6          });
 7       }
 8       
 9       async function test8_(){
10          let z= await test8(); //如果 始终不调用 resolve 这里将会一直等待下去 直到获得result
11          console.log(z);
12          console.log('end...');
13       }
14       
15       test8_();

 

 总结await ,async 和Promise 的关系 :

   1.  await 必须在 async修饰的函数中调用

    2. async 修饰的函数会把结果包装成Promise

   3. await 等待的如果不是Promise  和普通调用无异

   4.await 会一直等待Promise 的result 出现  并返回result

 

最后上全部的测试代码:

  1 <html>
  2   <head>
  3   <title>Promise/async/await 理解</title>
  4   </head>
  5   <body>
  6      <script type='text/javascript'>
  7      new Promise(function(resolve, reject){
  8          console.log('new 完后马上执行这个函数哦');
  9      });
 10      
 11      function test1(){
 12         return new Promise(function(resolve, reject){
 13            window.setTimeout(function(){
 14               try{
 15                 //throw '抛出的异常222'; //这里抛出的异常外部promise不能 直接  catch 到哦 需内部自己捕获后调用 reject 传递到catch
 16                 
 17                 console.log('test1.....');
 18                 resolve('ooookkkk..'); //resolve 向下一个then传递结果
 19               
 20               
 21               }catch(e){
 22                  reject(e); //向catch 传递结果
 23               }
 24               
 25            },1000);
 26            //throw '抛出的异常111'; //这里抛出的异常能直接被.catch() 捕获到哦  但是会使 setTimeout 里面的 resolve不再调用了哦
 27         }).then(function(r){
 28             console.log('调用 resolve 后会执行我哦');
 29             console.log(r);
 30         
 31         }).catch(function(r){
 32             console.log('调用 reject 或throw e后 后会执行我哦');
 33             console.log(r);
 34         });
 35      }
 36      
 37     //let res1= test1(); // res1 是 Promise;
 38     //console.log(res1);
 39      
 40      
 41      
 42      function test2(n){
 43         return new Promise(function(resolve, reject){
 44            window.setTimeout(function(){
 45               console.log(n);
 46               resolve(n+100);
 47            },1000);
 48         });
 49         //.then(function(r){   
 50         //    return 99999;
 51         //});
 52      }
 53      
 54      async function test2_(){
 55         //这里加上await 后  会等待resolve的结果n+100 或then里面的返回  如果不调用resolve 会一直等待  
 56         let a= await test2(1);  
 57         console.log(a);
 58         let b=    await test2(2);
 59         console.log(b);
 60         let c=    await test2(3);
 61         console.log(c);
 62      }
 63      
 64      //test2_();
 65      
 66      
 67       async function test3_(n){ //async return 会封装成 Promise 并把返回值 作为promise的result属性内容\
 68         
 69         window.setTimeout(function(){
 70               console.log(n);
 71               return n+100;
 72            },1000);
 73            if (n===3){
 74               throw '异常123';
 75            }
 76            let a='返回string='+n;
 77            return a;  //实际返回Promise(result=a);
 78      }
 79      
 80      async function test3(){
 81         let a= await test3_(1);  //这里的返回值是 函数的实际return 返回值 并不会等待里面的setTimeout完成
 82         console.log(a);
 83         let b=     test3_(2); //这里是 Promise 封装 里面封装了 return 返回值 作为result字段
 84         console.log(b);
 85         let c=      test3_(3).catch(function(r){console.log(r);});
 86         console.log(c);
 87         
 88         let d=new Promise(function(a,b){
 89            console.log('这样也可以直接执行哦');
 90            return 'oookkkk'; //这里的返回意义不大
 91         }).then(function(r){
 92            console.log('成功了会执行我哦');
 93         });
 94         
 95         console.log(d);
 96      }
 97      //test3();
 98      
 99      
100      function test4(n){
101           return new Promise(function(a, b){
102              window.setTimeout(function(){
103                 a(n+1000);
104              },2000);
105           });
106      }
107      
108      async function test4_(n){ 
109         let aa= await test4(n);
110         console.log(aa);
111         return aa; 
112      }
113      
114      async function test4___(){
115          let a=test4_(1);//这种调用方式不等待函数内部的异步结果 //返回Promise(result=aa);  如果await调用 则返回aa
116          console.log(a);
117          console.log('test4____');
118          let b=await test4_(2);//这种调用等待函数内部的具体结果aa
119      }
120      //test4___();
121      
122      
123       function test5(){
124          
125          console.log('111111');
126          window.setTimeout(function(){
127             console.log('222222');
128          },1000);
129          return 33333;
130       }
131       async function test5_(){
132           let a=await test5(); //这个时候和普通调用无异 因为没有返回Promise对象
133           console.log(a);
134       }
135       //test5_();
136       
137       
138       function test6(){
139         
140       }
141       function test7(){
142          //let z=await test6();//这种写法是错误的  因为test6没有返回Promise对象
143       }
144       
145       
146       function test8(){
147          return new Promise(function(resolve, reject){
148             resolve('成功返回'); //如果没有then语句  result='成功返回';  
149          }).then(function(r){
150             return '这里优先作为结果'; //如果有这个返回  最终result='这里优先作为结果';
151          });
152       }
153       
154       async function test8_(){
155          let z= await test8(); //如果 始终不调用 resolve 这里将会一直等待下去 直到获得result
156          console.log(z);
157          console.log('end...');
158       }
159       
160       test8_();
161       
162      </script>
163   </body>
164 </html>

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/834053.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WSL2的介绍和使用

WSL2的介绍和使用 一、什么是WSL2? WSL是Windows Subsystem for Linux的简称,它是微软为Win10和Win11引入的一项功能。WSL允许用户在Windows上运行Linux操作系统及其相关命令和应用程序,而无需使用虚拟机或安装双系统。 1.1 WSL2与WSL1、传统虚拟机比较WSL1:没有完整的Linu…

插件大总结

加注释插件搜索接口插件mybatis-plus插件

Windows系统日志报错:生成了一个严重警告并将其发送到远程终结点。这会导致连接终止。TLS协议所定义的严重错误代码是10。Windows SChannel错误状态是1203是怎么回事?

当我们检查Windows系统日志发现有一个报错:生成了一个严重警告并将其发送到远程终结点。这会导致连接终止。TLS协议所定义的严重错误代码是10。Windows SChannel错误状态是1203。导致报错的原因是什么?该如何处理?驰网飞飞和你分享当我们检查Windows系统日志发现有一个报错:…

Windows三种提权实验

以win7为例手动提权 上线 将一句话木马上传到win7当中,本地使用蚁剑进行链接。信息收集 systeminfo查询杀软信息 wmic process list briefWindows杀软在线查询无匹配杀软进程。 根据系统信息和杀软信息查询提权EXP Windows 提权辅助 | 在线安全工具以列出的微软编号MS17-017为…

量化训练及精度调优经验分享

本文提纲:fx 和 eager 两种量化训练方式介绍 量化训练的流程介绍:以 mmdet 的 yolov3 为例 常用的精度调优 debug 工具介绍 案例分析:模型精度调优经验分享第一部分:fx 和 eager 两种量化训练方式介绍 首先介绍一下量化训练的原理。上图为单个神经元的计算,计算形式是加权…

Tomcat Windows 服务 JVM 内存参数设置

Tomcat 在 Windows 平台上启动服务的方式是 Commons Daemon,JVM 的启动参数可以有多种设置方法。本文介绍 Commons Daemon 的大致组成和参数设置方法。 Commons Daemon 由两部分组成。 一是由 C 语言开发负责和操作系统交互的平台相关程序,在 Windows 上平台相关部分是 procr…

FileZilla的安装配置和使用教程

一、FileZilla简介 FileZilla是一款免费开源的FTP软件,有以下优点:非常易于使用,且跨平台(Linux、Windows、MacOs等) 支持FTP、FTPS、SFTP等多种文件传输协议 支持断点续传 支持建立多个标签(标签为一个FTP连接界面)同时工作 支持远程查找文件 自带功能强大的站点管理和…

云行 | 金陵古都焕发数智活力,天翼云为南京创新发展注入新动能!

10月29日,以“国云智算聚金陵 自主可控铸新基”为主题的天翼云中国行江苏南京站活动圆满举办。南京市数据局领导、中国电信江苏分公司领导、客户及合作伙伴代表莅临现场,共商转型发展新机遇,共创智慧江苏新未来。会上举行了天翼云全栈自主可控能力升级计划、南京城市算力调度…

10月回顾 | Apache SeaTunnel社区动态与进展一览

各位热爱 Apache SeaTunnel 的小伙伴们,社区10月份月报来啦,请查收! 这里将记录Apache SeaTunne社区每月动态和进展,欢迎关注。 月度Merge之星 感谢以下小伙伴上个月为 Apache SeaTunnel 所做的精彩贡献(排名不分先后):@Hisoka-X,@prclin,@JohnTeslaa,@happyboy1024,@ji…

微短剧出海新攻略:多语言翻译提效,窄带高清降本,合规之下畅享极致播放

短剧出海「 全能力解锁 」快速轻装,一站出海。 短剧出海作为近两年的蓝海赛道,发展潜力惊人,据机构报告数据显示,2023国内短剧市场规模达53亿美元,而海外短剧市场规模高达650亿美元,全球市场发展潜力巨大。 想要在规模激增的全球内容市场中稳健出海,技术可以提效降本,…

井底车场人员进入识别智慧矿山一体机罐笼乘坐人员超限识别重塑矿山作业模式,提升管理效能

在矿山行业,安全始终是最重要的议题之一。随着科技的进步,智能化设备的应用已经成为提升矿山安全管理水平的关键。智慧矿山一体机,作为新一代的智能化解决方案,正是在这样的背景下应运而生。它不仅是一款设备,更是一个全面整合的安全管理系统,旨在通过前沿的人工智能技术…

使用 JuiceFS 快照功能实现数据库发布与端到端测试

今天的博客来自 JuiceFS 云服务用户 Jerry,他们通过使用 JuiceFS snapshot 功能,创新性地实现了数据的版本控制。Jerry,是一家位于北美的科技公司,利用人工智能和机器学习技术,简化用户购买汽车和家庭保险的比较及购买流程。在软件开发领域,严格的测试和受控发布已经成为…