Promise,async,await 面试题

2023-11-05

目录

推荐先看Promise 相关知识点

5,面试题

1

结果 1,5,2,3,4

const promise = new Promise((resolve, reject) => {
  console.log(1);
  setTimeout(() => {
    console.log(2);
    resolve();
    console.log(3);
  });
});

promise.then(() => {
  console.log(4);
});

console.log(5);

因为 then() 中的回调函数虽然是微任务,但也得等到 promise 变为 fulfilled 状态才会执行。

2

结果 1,3,2

async function fun() {
  console.log(1); // 同步
  const n = await 2;
  console.log(n);
}

fun();
console.log(3);

因为 fun() 函数中的同步语句会直接执行,异步的才会延迟执行。

// 相当于
function fun() {
  console.log(1);
  Promise.resolve(2).then((n) => {
    console.log(n);
  })
}

3

结果 1,4,2,3

async function fun() {
  console.log(1); // 同步
  const n = await 2;
  console.log(n);
}

(async () => {
  await fun();
  console.log(3);
})();

console.log(4);

同理,立即执行函数执行后,await fun() 中的同步代码先执行,异步代码进入微队列等待执行。所以先输出 1 后输出 4。

4

结果 Promise {<pending>},Promise {<pending>},4,1,3,1

async function fun1() {
  return 1;
}

async function fun2() {
  const n = await fun1();
  console.log(n); // 1
  return 2; // 没用被用到
}

async function fun3() {
  const n = fun2(); // 注意没有 await
  console.log(n);
  return 3;
}

fun3().then((n) => {
  console.log(n); // n 是 fun3 的返回值 3
});

fun3();

console.log(4);

1,先看同步代码的执行。

  • 第1个 fun3() 执行,会执行 fun2(),再执行 await fun1(),会将 async fun1 返回的 Promise 对象的后续处理,放到微队列中等待执行(任务1)。
const n = await fun1();
console.log(n);

// 相当于
new Promise((resolve) => {
  resolve(1)
}).then((n) => {
  console.log(n);
})
  • 因为 fun2async 修饰,而且还有异步代码,所以此时 fun2() 执行的结果是一个 pending 状态的 Promise 对象,所以输出 Promise {<pending>}fun3() 的后续处理:then() 的回调函数进入微队列等待执行(任务2)。
  • 第2个 fun3() 执行,再次输出 Promise {<pending>},并添加微任务3
  • 输出 4

2,接下来看异步代码的执行。

  • 执行微队列中的任务1输出 1,任务2输出 3,任务3输出 1

5

结果 1

Promise.resolve(1).then(2).then(Promise.resolve(3)).then(console.log)

参考 3.2 的知识点。then() 的参数不是函数,说明没有对前一个任务做后续处理,相当于无效代码。

// 等价
Promise.resolve(1).then(console.log)

6

结果:promise1,undefined,end,promise2,promise3,promise4,Promise {<pending>},after1

var a
var b = new Promise((resolve, reject) => {
  console.log('promise1')
  setTimeout(() => {
    resolve()
  }, 1000)
})
  .then(() => {
    console.log('promise2')
  })
  .then(() => {
    console.log('promise3')
  })
  .then(() => {
    console.log('promise4')
  })

a = new Promise(async (resolve, reject) => {
  console.log(a)
  await b
  console.log(a)
  console.log('after1')
  await a
  resolve(true)
  console.log('after2')
})
console.log('end')

注意,ba 都是右边 Promise 执行的结果。右边先执行,再赋值给左边的变量。

1,先看同步代码执行

  • 执行 b 右边的表达式,输出 promise1setTimeout 的回调函数进入宏队列等待执行。此时 b 被赋值为一个 pending 状态的 Promise 对象。
  • 执行 a 右边的表达式,输出 undefined(此时 a 未赋值)。
  • 执行 await b,因为此时 bpending 状态,所以后续代码都不会执行,所以 a 也被赋值为一个 pending 状态的 Promise 对象
  • 输出 end

2,再看异步代码执行

  • 没有微队列,所以执行宏队列中 setTimeout 的回调函数,将 b 变为 fulfilled 状态,接着执行后续 3个 then(),依次输出 promise2promise3promise4
  • 现在 b 变为 fulfilled 状态,所以 await b 执行完成,开始执行后续代码。
  • 注意到 a 现在还是一个 pending 状态的 Promise 对象,所以输出 Promise {<pending>} ,再输出 after1
  • 执行 await a,将永远等待,因为没有更改状态的机会。

7

结果 script start,async1 start,async2,p1,script end,async1 end,p2,settimeout

async function async1() {
  console.log('async1 start')
  await async2()
  console.log('async1 end')
}

async function async2() {
  console.log('async2')
}

console.log('script start')

setTimeout(() => {
  console.log('settimeout')
}, 0)

async1()

new Promise(function (resolve) {
  console.log('p1')
  resolve()
}).then(function () {
  console.log('p2')
})

console.log('script end')

1,先看同步代码执行

  • 输出 script startsetTimeout 的回调函数进入宏队列等待执行。
  • 执行 async1(),输出 async1 start
  • 执行 await async2() 中的同步代码,输出 async2await async2() 之后的代码,相当于在 then() 的回调函数中执行,所以进入微队列等待。
await async2()
console.log('async1 end')

async function async2() {
  console.log('async2')
}

// 相当于
new Promise((resolve) => {
  console.log('async2')
  resolve()
}).then(() => {
  console.log('async1 end')
})
  • 输出 p1then() 的回调函数进入微队列等待。
  • 输出 script end

2,再看异步代码执行。

  • 先执行微队列中的任务,输出 async1 end,再输出 p2
  • 再执行宏队列中的任务,输出 settimeout

以上。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Promise,async,await 面试题 的相关文章

  • 为任何更新查询增加 Mongoose 文档版本的简单方法?

    我想开始利用 Mongooses 文档版本控制 v key 我在实际增加版本值时遇到了问题 然后我发现您必须添加this increment 执行查询时 有没有办法自动递增 目前 我只是将其添加到pre用于更新类型查询的中间件 module
  • AJAX 安全问题

    我希望能够解决一些关于 AJAX 安全性的问题 这是我试图理解的一个场景 假设我正在使用 AJAX 向页面请求一些半敏感材料 例如 我将把用户的 ID 传递给一个 php 文件 并返回一些关于他们自己的信息 现在 是什么阻止人们模拟此 Ja
  • 如何恢复文本框数据

    我有一个小小的要求 我们已经恢复了之前清除的文本框数据 下面是我的 HTML 代码 table tr td td tr table
  • 我可以通过什么方式混合 jQuery 和 vanilla JavaScript

    我有一个用普通 JavaScript 编写的 Web 应用程序 我想用 jQuery 动画来增强它 并使用我在各种 jQuery 插件中找到的一些功能 例如上传 http www uploadify com 可以通过什么方式将 jQuery
  • 如何使用多个 select2 框过滤表格?

    我正在尝试使用 和多个 select2 框的类来过滤表格 表格 HTML table class table tbody tr class kanban event Austin td td tr tr class csm event Ch
  • 在节点环境中存根 jQuery.ajax (jQuery 2.x)

    我正在尝试运行一些需要存根的测试jQuery ajax 我正在使用 SinonJS 来做到这一点 它曾经与旧版本的 jQuery 1 x 一起工作得很好 var require jquery var sinon require sinon
  • 获取被调用的 javascript 文件的查询字符串

    是否可以在调用的 javascript 文件上使用 javascript 获取查询参数 如下所示 in html in file js console log this location query 这是否可能以某种方式实现 或者我必须使用
  • 如何在React Native的MapView中设置标记

    我想在React Native中的MapView上设置一个标记 但是通过官方文档找不到任何信息MapView https facebook github io react native docs mapview html content 如
  • Apache Thrift Java-Javascript 通信

    我正在编写一个基于 Apache Thrift 的 Java 服务器 它将从 Javascript 客户端接收数据 我已经完成了 Java 服务器 但问题是我可以获得 Javascript 客户端的工作示例 我无法找到一个好的示例 构建文档
  • websockets 如何处理同一浏览器的两个选项卡

    I have 1 个 PHP 服务器 提供 http 请求 和 1 node js 发布更新的数据消息 每个连接都带有 websocket php 服务器设置其 cookie 在一个浏览器中 此 cookie 可在所有选项卡中使用 当浏览器
  • 使用 float:left 与 display:inline-block 的 jQuery UI 拖放排序比较

    我这里有两个例子 这两个例子之间的唯一区别是 一种使用display inline block 另一种使用float left li doc item 显示 内联块 与 li doc item float left 我的问题是 displa
  • Chrome --app 相当于 Firefox\IE

    我有一个网络应用程序 客户要求单击不同按钮时更改浏览器窗口大小 我发现在那link https stackoverflow com questions 13436855 launch google chrome from the comma
  • 可以禁用幻灯片的触摸模拟但不能禁用滚动条(危险的滑动器)吗?

    我的页面上有一个危险的滑动器 它成功地模拟了幻灯片和随附滚动条上的触摸事件 允许单击鼠标并移动以向左或向右滑动幻灯片 这很好 但我现在在滑动器内的幻灯片上调用了可拖动 这意味着我需要停止此触摸模拟 拖动幻灯片并同时移动它们会引起混乱 但仅限
  • Angular2:动态同步http请求

    Goal 发出一系列同步 http 请求并能够将它们作为一个可观察流进行订阅 示例 不工作 let query arr test1 test2 test3 function make request query arr if query a
  • 播放没有音频标签的音频

    是否可以在没有音频标签的情况下仅使用 javascript 播放音频 我通过 tinyMce 编辑器注入脚本 因为我无权访问网站的后端 并且它不支持客户端的音频标签 她只想要当您将鼠标悬停在图像上时发出简单的声音 我已经完成了所有设置 但是
  • 从链接打开本地文件夹

    如何通过单击任何链接打开本地文件夹视图 我尝试了很多选择 例如 a href Open folder a or a Open folder a or a Open folder a 解决方案 启动可下载链接 以下内容适用于所有浏览器 但一如
  • Angular JS - 使服务可以从控制器和视图全局访问

    假设我们有以下服务 myApp factory FooService function 然后 从控制器中 我会说 myApp controller FooCtrl scope FooService function scope FooSer
  • 如何解决“消息端口在收到响应之前已关闭”的问题。在 JavaScript 中的 window.location.reload() 之后

    我遇到了 javascript 问题 从 chrome v73 0 3683 86 开始 每当我在 window location reload 函数之后运行 javascript 代码时 它总是给我错误 Unchecked runtime
  • onPress 方法中箭头函数与普通函数的行为

    正在学习 Native React 并学习更多关于 javascript 的知识 所以我仍然不明白它的行为的很多事情 我使用 TouchableOpacity 及其 onPress 属性创建了一个按钮组件 为了让它工作 我必须发送我想要执行
  • JavaScript 阶乘防止无穷大

    我一直在 JavaScript 中使用这个函数来计算阶乘数 var f function factorial n if n 0 n 1 return 1 if f n gt 0 return f n return f n factorial

随机推荐

  • 解决IE识别ES6语法

    使用jq做项目时 混用了部分es6的语法 导致在IE下项目无法正常运行 于是乎 便在网上找到了下面两种方法 并尝试了一下 一 直接在浏览器中引入browser min js 并且将script的type设置成text babel 尝试了在网
  • laravel 中 使用 composer 的中国镜像安装时报错(找不到包)

    composer require jenssegers mongodb 安装mongodb时报错 Your requirements could not be resolved to an installable set of packag
  • SpringBoot Admin集成诊断利器Arthas实践

    前言 Arthas 是 Alibaba开源的Java诊断工具 具有实时查看系统的运行状况 查看函数调用参数 返回值和异常 在线热更新代码 秒解决类冲突问题 定位类加载路径 生成热点图 通过网页诊断线上应用 如今在各大厂都有广泛应用 也延伸出
  • 使用docker搭建elk

    一 安装前须知 以下步骤在 VMware 中的 centos 7 中操作 ip 地址为 192 168 161 128 注意安装的时候最好统一版本 否则后面会出现许多问题 进官网搜索对应镜像 查看 Tags 标签下的版本 目前我这最新的 T
  • Transformer怎么入门?如何学习Transformer?

    Transformer比较好学 整个路线也非常简单 就三步 第一步 理论学习 理论学习部分首先要了解Attention机制 这里推荐李宏毅老师的机器学习 或者看他的PPT 讲的很清楚 国外的也有斯坦福的CS25 Transformers U
  • 校园资料分享平台的设计与开发、资料分享

    目录 1 使用框架和技术 2 功能展示与说明 3 系统展示 3 1 使用到技术 3 2 前台展示 3 3 后台界面 4 论文资料和程序 在教育领域 使用IT技术可以使任何人 任何地方和任意的时间 都可以获得需要的资料 但现在的校园大多是综合
  • [stable-diffusion-art] 指北-4 模型

    Beginner s guide to Stable Diffusion models and the ones you should know Stable Diffusion ArtHow to install use and merg
  • 史上最全的 Python 3 类型转换指南

    int 支持转换为 int 类型的 仅有 float str bytes 其他类型均不支持 float gt int 会去掉小数点及后面的数值 仅保留整数部分 int 12 94 12 str gt int 如果字符串中有数字 0 9 和正
  • Windows下误删文件解决办法

    推荐几款优秀的数据恢复软件 Disk Drill Disk Drill是一款免费软件 支持支Windows 与 Mac 使用它能我们找回磁盘 U盘 等各种储存装置的视频 照片 文章等各类文件 最早了解这款软件还是当初帮一个妹纸的电脑恢复照片
  • 中国电信定制的中兴 ZXV10 B760H 机顶盒root全程记录

    家里有台机顶盒 是中兴 ZXV10 B760H 它是智能机顶盒 在写这篇文章之前 我已經对它进行了破解 别看是 智能机顶盒 但实际上已經让中国电信阉割的差不多了 只能看IPTV 我这个破解可以让它安装第三方app 今天重点讲root 你需要
  • ————博客永久废止————转到http://1su.net/nsB

    由于CSDN博客太难以管理 博主转向Ghost Blog Node的博客引擎 该博客永久废止 新的博客地址为http 1su net nsB
  • FutureTask 源码 并发设计模式

    一 代码 https www jianshu com p 60f661d95d53 public static void main String args throws Exception Callable
  • spring应用上下文的理解

    spring应用上下文的理解 容器 什么叫容器呢 如果你想要一个手机 好这时候spring就给你一个手机 你想要使用的对象 spring就会给你 但是现在我们就会问那spring给的对象来自于哪里呢 spring要负责的工作很多 那么多对象
  • Matlab矩阵

    1 通用的特殊矩阵 zeros函数 产生全0矩阵 ones函数 产生全1矩阵 eye函数 产生对角线为1的矩阵 当矩阵是方阵时 得到一个单位矩阵 rand函数 产生 0 1 区间均匀分布的随机矩阵 randn函数 产生均值为0 方差为1的标
  • Bootstrap统计学方法简介以及中心极限定理

    一 概念 Bootstrap 一词出自英文习语 pull yourself up by your bootstraps 它的隐含意是 improve your situation by your own efforts 即 通过你自己的努力
  • 163免费企业邮箱申请后怎么登陆?

    163免费企业邮箱目前的用户已经很多了 而关于申请的流程却并不多 很多人想用却不知道怎么注册申请 申请后又不清楚怎么登陆 下面小编为您讲解163免费企业邮箱注册申请及登陆流程 163免费企业邮箱注册申请 搜索163免费企业邮箱 打开企业邮箱
  • Git---企业级开发模型

    文章目录 前言 拓展 一 系统开发环境 二 Git分支设计规范 master分支 release分支 develop分支 feature分支 hotfix分支 三 企业级项目管理实战 准备工作 创建项目 创建仓库 添加成员 1 添加企业成员
  • redis分页查询代码实现

    redis分页查询 简单明了代码实现 本文是个基于redis的分页查询实现 场景描述 Redis分页自定义包装类 收藏和取消收藏biz业务处理 查询收藏数 查询用户收藏状态 分页查询我的收藏 本文是个基于redis的分页查询实现 本人业务开
  • 【JavaScript】Math 对象常见方法详解

    文章目录 JavaScript Math 对象常见方法详解 Math常见的方法 1 Math random 2 Math round 3 Math ceil 4 Math floor 5 Math abs 6 Math min 7 Math
  • Promise,async,await 面试题

    目录 5 面试题 1 2 3 4 5 6 7 推荐先看Promise 相关知识点 5 面试题 1 结果 1 5 2 3 4 const promise new Promise resolve reject gt console log 1