首页 > 其他分享 >关于Promise的超难面试题解读

关于Promise的超难面试题解读

时间:2023-08-10 17:58:34浏览次数:374  
标签:面试题 console log 队列 超难 promise Promise 方法

让我来看一下题目,如下所示

Promise.resolve().then(()=>{
				console.log(0);
				return Promise.resolve(4);
			}).then((res)=>{
				console.log(res);
			});
			
			Promise.resolve().then(()=>{
				console.log(1);
			}).then(()=>{
				console.log(2);
			}).then(()=>{
				console.log(3);
			}).then(()=>{
				console.log(4);
			}).then(()=>{
				console.log(5);
			}).then(()=>{
				console.log(6);
			})

该代码中有两个Promise,第一个Promise状态自然是fullfield,我们记作pr1:F。

console.log(0);
return Promise.resolve(4);

根据promiseA+规范,我们得出在调用then方法之后必然产生一个新的promise,并由下面两行代码决定,我们记作p0:p,此时他的状态是pending。
此时完成状态的promise方法调用then方法,会把其中的回调函数加到微队列,我们记作micro:0,
接下来又调用了一个then方法,那有产生了一个promise,我们记作pres:p。
接下来新的promise方法,又产生了一个fullfield状态的promise,记作pr2:f,接下来产生的pending状态记作p1:p,加入到微队列,如此类推,产生p2:p,p3:p,p4:p,p5:p,p6:p。
此时我们的微队列micro:0,1。但是问题来了,我们的返回值是一个promise函数,这是V8引擎会如何处理呢?
来,我们看一下A+规范,如果你的then方法返回值是一个promise,那么该then方法的状态将由返回值promise决定,问题关键点了来了我们不知道他是如何保持一致的,同步还是异步呢?
他会在p4的then方法里完成p0,他会将这些步骤放到微队列中执行,我们看一下V8的源码:

const task=NewPromiseResolveThenableJobTask(
   promise,uUnsafeCast<JSReceiver>(resolution),
   UnsafeCast<Callable>(then));
return EnqueueMicrotask(task.context,task);

p4调用了他的then方法并加入到微队列,此时p0还是pending状态,此时控制台输出0,p1输出1状态占位fullfield,此时两个promise的第一次then方法微队列执行完毕,输出0,1,放到微队列的p4开始执行,promise输出无效果,把p4then方法加入到微队列,执行then方法,此时p0的状态为fullfield,立刻把res放到微队列p4,先p1输出p2是输出的是promise(4),然后输出p3,输出then方法,依次类推输出56,最终结果就是0123456。

标签:面试题,console,log,队列,超难,promise,Promise,方法
From: https://www.cnblogs.com/weihaohome/p/17621081.html

相关文章

  • RabbitMQ面试题大全含答案
    rabbitmq的使用场景有哪些?①.跨系统的异步通信,所有需要异步交互的地方都可以使用消息队列。就像我们除了打电话(同步)以外,还需要发短信,发电子邮件(异步)的通讯方式。②.多个应用之间的耦合,由于消息是平台无关和语言无关的,而且语义上也不再是函数调用,因此更适合作为多个应用之间的松......
  • 面试题:使用Java代码实现B系统与A系统企业信息定时同步
      java代码实现B系统与A系统企业信息的定时同步.具体要求如下:需要使用ApacheHttpComponentsClient实现接口调用;分页调用接口文档中“获取客户列表”接口接收数据,存储到customer表中;每10分钟同步一次企业信息;A系统企业出现增,删,改,B系统都能够同步;接口调用需要有重试机制......
  • 面试题:使用Java代码实现B系统与A系统企业信息定时同步
      java代码实现B系统与A系统企业信息的定时同步.具体要求如下:需要使用ApacheHttpComponentsClient实现接口调用;分页调用接口文档中“获取客户列表”接口接收数据,存储到customer表中;每10分钟同步一次企业信息;A系统企业出现增,删,改,B系统都能够同步;接口调用需要有重试机制......
  • 【JavaScript30】promise
    在前端js中是可以发送网络请求的,如果前端js的请求是线性的请求(同步),网站的体验会很差。设计js发请求的那个人.选择了使用异步执行方式.大幅度的提升用户体验.console.log("我要发请求了");setTimeout(function(){console.log("服务器返回结果了");},2000);//假设......
  • 面试题:使用Java代码实现B系统与A系统企业信息定时同步
    ​  java代码实现B系统与A系统企业信息的定时同步.具体要求如下:需要使用ApacheHttpComponentsClient实现接口调用;分页调用接口文档中“获取客户列表”接口接收数据,存储到customer表中;每10分钟同步一次企业信息;A系统企业出现增,删,改,B系统都能够同步;接口调用需要有......
  • 面试题:使用Java代码实现B系统与A系统企业信息定时同步
    ​  java代码实现B系统与A系统企业信息的定时同步.具体要求如下:需要使用ApacheHttpComponentsClient实现接口调用;分页调用接口文档中“获取客户列表”接口接收数据,存储到customer表中;每10分钟同步一次企业信息;A系统企业出现增,删,改,B系统都能够同步;接口调用需要有......
  • 重学JavaScript Promise API
    在这篇教程中,我们将掌握如何在JavaScript中创建并使用Promise。我们将了解Promise链式调用、错误处理以及最近添加到语言中的一些Promise静态方法。什么是Promise?在JavaScript中,一些操作是异步的。这意味着当这些操作完成时,它们产出的结果或者值并不会立即生效。Promise是一......
  • PHP秒杀面试题
    什么是秒杀系统:秒杀系统是一个处理大量并发用户请求的系统,通常用于限时促销或特定活动中,用户可以在特定时间内以抢购的方式购买商品或服务。秒杀系统可能面临的挑战是什么?秒杀系统可能面临以下挑战:高并发:大量用户在同一时间请求系统,可能导致服务器压力巨大。数据库压......
  • MySQL实战面试题
    createdatabasehufei;usehufei;createtableuser_info(idint,device_idint(10),gendervarchar(14),ageint,universityvarchar(32),provincevarchar(32),gpafloat);insertintouser_infovalues(1,2138,'male',21,'北京大学','Beijing&#......
  • 最常见的 PostgreSQL 面试题
    PostgreSQL是众多可用数据库中最顶级、最强大和开源的数据库之一。它扩展了SQL语言,主要用作许多移动、Web和分析应用程序的主要数据仓库。对PostgreSQL认证专家的需求增长良好。因此,在这里我们上传了一些常见的PostgreSQL面试问题和答案,以帮助您pojie面试。通过这些Postgre......