当前位置: 首页 > news >正文

Es6的promise和async

一、promise
promise将异步的操作以同步的流程表达出来
有三种状态:pending(进行中)  fulfied(已成功) rejected(已失败)
一旦状态改变就不会再变1.pending->fulfied  2.pending->rejected
解决层层巧嵌套的回调地狱

1.回调地狱,这个代码写的虽然没有问题,但是输出的时候我们本意是每1s输出一个1,然后在1后边0.5秒输出一次2,但是这段代码执行的时候是异步执行的,所以输出的时候会特别的乱,所谓回调地狱

setInterval(
  ()=>{ 
       console.log(1);
       setInterval(()=>{
       console.log(2)
             },500)
                 },1000
             )

2.Promise

我们用new方法新建一个Promise,其中的代码执行是同步的然后调用resolve()和reject()函数,当执行成功的时候调用resolve,失败的时候调用reject函数;那么俩个函数在哪定义的呢,在后边.then中第一个箭头函数是reslove的方法,第二个函数是reject的方法。

        new Promise((resolve, reject) => {
             setTimeout(() => {
              console.log(1);
             //成功调用resolve
               resolve();
                 //失败调用reject
                 reject();
            }, 1000)
        }).then(() => {
           setTimeout(() => {
               console.log(2)
           }, 500)
       }
           , () => {
               console.log("请求失败");
           })
        //前边为成功执行的函数 后边为失败的函数

3.all和catch

all 所有都执行才会执行all 有失败就会走到catch,如下代码实例,当我们Promise都执行完成后会输出ok如果有一个执行的时候失败了,就会走到catch函数内

 
        let p1 = new Promise((resolve, reject) => {
            setTimeout(() => {
                console.log(1);
                // resolve();
                reject();
            }, 1000)
        })
        let p2 = new Promise((resolve, reject) => {
            setTimeout(() => {
                console.log(2);
                resolve();
            }, 800)
        })
        let p3 = new Promise((resolve, reject) => {
            setTimeout(() => {
                console.log(3);
                resolve();
            }, 2000)
        })
        Promise.all([p1, p2, p3]).then(
            () => {
                console.log("ok");
            }
        ).catch(() => {
            console.log("失败");
        })

4.race

当最快的代理执行了,那么就会执行race中的函数,注意的是,这里边有失败的也会算,也是去找最快的

     //race 先走到最快的执行race
               let p1 = new Promise((resolve, reject) => {
             setTimeout(() => {
                 console.log(1);
                 // resolve();
                 reject();
             }, 1000)
         })
         let p2 = new Promise((resolve, reject) => {
             setTimeout(() => {
                 console.log(2);
                 resolve();
             }, 800)
         })
         let p3 = new Promise((resolve, reject) => {
             setTimeout(() => {
                 console.log(3);
                 resolve();
             }, 2000)
         })
         Promise.race([p1, p2, p3]).then(
             () => {
                 console.log("ok");
             }
         ).catch(() => {
             console.log("失败");
         })
    </script>

上述面试提问总结:

1.请你解释一下什么是异步 什么是同步
2.请你说出你对promise得理解是把异步得方法 用同步得方案给解决掉了  (真正出现就是为了解决回调地狱得问题)
3.promise 当中一共有三个状态  padding (进行中) fulfied(成功)  rejected(失败状态下所执行)
4.all race (all等所有得都执行完 再执行all里面得then方法  但是只要有一个返回得状态为失败  catch)
5.race (永远是根据时间顺序来的  我只看第一个  第一个如果是成功 那么调用then方法 如果第一个失败 调用catch) 

二、async

1.    async await 
async规定必须返回得是promise对象,async用来定义异步函数
async定义了一个函数返回时是一个promise对象

await只能在async函数中用,在其他地方用会报错,作用是执行某个函数,等某个函数执行完了再往下走

	 <script>
		 async function first(){
			 return new Promise((resolve,reject)=>{
				 setTimeout(function(){
					
					 //模拟后台给我前端得数据
					 let res = {
						 message:'xiaohei'
					 }
					 resolve(res);
				 },1000);
				 
			 })
		 }
		 
		 async function second(msg){
			 return new Promise((resolve,reject)=>{
				 setTimeout(function(){
					
					 resolve();
				 },2000);
			 })
		 }
		 
		 async function error(){
			 return new Promise((resolve,reject)=>{
				 setTimeout(function(){
					
					 reject({message:'失败了'});
				 },2000);
			 })
		 }
		 
		 
		 //promise 是把异步得方法 用同步得方案给解决掉了
		 
		 async function fn(){
			 console.log(1); // 解构赋值
			 let {message} = await first();
			 console.log(message);
			 await second(message);
			 console.log(3);
			 await error().catch(function(res){
				 console.log(res)
			 })
		 }
		 
		 fn();

其中错误的时候用catch捕获,其中的参数为reject中的实参

相关文章:

  • Java项目本地部署宝塔搭建实战java中小医院管理系统源码
  • java 低耦合观察者模式
  • 七、OCR-PaddlePaddle训练源码解析系列-文字识别
  • 数据结构与算法之非递归遍历二叉树
  • Unity技术手册 - 创建物体有几种方式?
  • threejs中各种的对像详细介绍
  • 代码优化~关注核心逻辑,封装常用规则
  • Android车载开发基础学习——蓝牙通信是如何实现的?
  • 智慧政务、数字化优先与数字机器人,政务领域正在开启“政务新视界”
  • DES算法是对称算法吗,能否通过在线工具进行DES解密?
  • 【车间调度】基于GA/PSO/SA/ACO/TS优化算法的车间调度比较(Matlab代码实现)
  • springBoot 的默认线程池-ThreadPoolTaskExecutor
  • 暑期结束为你的新学期立下Flag吧
  • 大数字符串加法
  • ROS1云课→28机器人代价地图配置
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • IDEA常用插件整理
  • JSONP原理
  • Python 基础起步 (十) 什么叫函数?
  • react 代码优化(一) ——事件处理
  • React-flux杂记
  • 阿里云购买磁盘后挂载
  • 聊聊redis的数据结构的应用
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • 走向全栈之MongoDB的使用
  • ionic入门之数据绑定显示-1
  • ​​​​​​​GitLab 之 GitLab-Runner 安装,配置与问题汇总
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • #传输# #传输数据判断#
  • $jQuery 重写Alert样式方法
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (多级缓存)缓存同步
  • (分享)自己整理的一些简单awk实用语句
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (排序详解之 堆排序)
  • (三) diretfbrc详解
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • (转)memcache、redis缓存
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版
  • (转)为C# Windows服务添加安装程序
  • .htaccess 强制https 单独排除某个目录
  • .Net Core webapi RestFul 统一接口数据返回格式
  • .net core控制台应用程序初识
  • .NET 跨平台图形库 SkiaSharp 基础应用
  • .NET高级面试指南专题十一【 设计模式介绍,为什么要用设计模式】
  • .NET企业级应用架构设计系列之应用服务器
  • .NET性能优化(文摘)
  • .net中调用windows performance记录性能信息