promise的执行顺序(由一道bilibili面试题看Promise异步执行机制)

2026-05-01 19:15:01 :0

promise的执行顺序(由一道bilibili面试题看Promise异步执行机制)

这篇文章给大家聊聊关于promise的执行顺序,以及由一道bilibili面试题看Promise异步执行机制对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。

本文目录

由一道bilibili面试题看Promise异步执行机制

求上面的输出顺序和输出值,为什么?

答案:

其中,关于时间差结果可能因为计算机性能造成的微小差异,可忽略不计

你答对了吗?下面我们由浅入深探索本题

首先,看一下 event loop 的基础必备内容

event loop 执行顺序:

微任务包括: MutationObserver 、 Promise.then()或catch() 、 Promise为基础开发的其它技术,比如fetch API 、 V8 的垃圾回收过程、 Node独有的process.nextTick 、 Object.observe (已废弃; Proxy 对象替代)

宏任务包括 : script 、 setTimeout 、 setInterval 、 setImmediate 、 I/O 、 UI rendering 、 postMessage 、 MessageChannel

注意: 下面的题目都是执行在浏览器环境下

遇到不好理解的,可结合 promise 源码 进行理解,就很简单了

解析:

解析:

解析:

解析:

解析:

解析:

解析:

解析:

现在看,本题就很简单了

解析:

详解如何构建Promise队列实现异步函数顺序执行



场景
有a、b、c三个异步任务,要求必须先执行a,再执行b,最后执行c
且下一次任务必须要拿到上一次任务执行的结果,才能做操作
思路
我们需要实现一个队列,将这些异步函数添加进队列并且管理它们的执行,队列具有First In First Out的特性,也就是先添加进去的会被先执行,接着才会执行下一个(注意跟栈作区别)
大家也可以类比一下jQuery的animate方法,添加多个动画也会按顺序执行
解决
模拟3个异步函数
// 异步函数a
var a = function () {
return new Promise(function (resolve, reject) {
setTimeout(function () {
resolve(’a’)
}, 1000)
})
}
// 异步函数b
var b = function (data) {
return new Promise(function (resolve, reject) {
resolve(data + ’b’)
})
}
// 异步函数c
var c = function (data) {
return new Promise(function (resolve, reject) {
setTimeout(function () {
resolve(data + ’c’)
}, 500)
})
}
解决方法一(使用then链式操作)
特点:可以满足需求,但是书写比较繁琐
代码
//链式调用
a()
.then(function (data) {
return b(data)
})
.then(function (data) {
return c(data)
})
.then(function (data) {
console.log(data)// abc
})
方法二(构建队列)
特点:封装方法,可移植到别处使用
代码
// 构建队列
function queue(arr) {
var sequence = Promise.resolve()
arr.forEach(function (item) {
sequence = sequence.then(item)
})
return sequence
}
// 执行队列
queue()
.then(data =》 {
console.log(data)// abc
})
方法三(使用async、await构建队列)
同方法二,只是显得更高大上点
代码
async function queue(arr) {
let res = null
for (let promise of arr) {
res = await promise(res)
}
return await res
}
queue()
.then(data =》 {
console.log(data)// abc
})
顺便说一句,bluebird的Promise.reduce也可以用来顺序执行函数,但是可使用的场景非常有限,一般用来读取文件信息,而以上给出的方法,不管你在异步函数中做了什么,只要函数最后返回了一个Promise对象,都可以使用

Promise简书

promise是什么?

1、主要用于异步计算

2、可以将异步操作队列化,按照期望的顺序执行,返回符合预期的结果

3、可以在对象之间传递和操作promise,帮助我们处理队列

为什么会有promise?

为了避免界面冻结(任务)

同步:假设你去了一家饭店,找个位置,叫来服务员,这个时候服务员对你说,对不起我是“同步”服务员,我要服务完这张桌子才能招呼你。那桌客人明明已经吃上了,你只是想要个菜单,这么小的动作,服务员却要你等到别人的一个大动作完成之后,才能再来招呼你,这个便是同步的问题:也就是“顺序交付的工作1234,必须按照1234的顺序完成”。

异步:则是将耗时很长的A交付的工作交给系统之后,就去继续做B交付的工作,。等到系统完成了前面的工作之后,再通过回调或者事件,继续做A剩下的工作。

AB工作的完成顺序,和交付他们的时间顺序无关,所以叫“异步”。

resolve作用是,将Promise对象的状态从“未完成”变为“成功”(即从 pending 变为 resolved),在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;

reject作用是,将Promise对象的状态从“未完成”变为“失败”(即从 pending 变为 rejected),在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。

1、pending初始状态

2、fulfilled操作成功

3、rejected操作失败

当promise状态发生改变,就会触发then()里的响应函数处理后续步骤;

promise状态一经改变,不会再变。

Promise对象的状态改变,只有两种可能:

从pending变为fulfilled

从pending变为rejected。

这两种情况只要发生,状态就凝固了,不会再变了

1.Promise.all() 批量执行

Promise.all()用于将多个promise实例,包装成一个新的Promise实例,返回的实例就是普通的promise

它接收一个数组作为参数

数组里可以是Promise对象,也可以是别的值,只有Promise会等待状态改变

当所有的子Promise都完成,该Promise完成,返回值是全部值得数组

有任何一个失败,该Promise失败,返回值是第一个失败的子Promise结果

常见用法:

异步操作和定时器放在一起,,如果定时器先触发,就认为超时,告知用户;

例如我们要从远程的服务家在资源如果5000ms还没有加载过来我们就告知用户加载失败

2.Promise.race()
与 Promise.all 类似,但只等待第一个 settled 的 promise 并获取其结果(或 error)。
3.Promise.allSettled()
等待所有的 promise 都被 settle,无论结果如何。结果数组具有:

4.Promise.resolve()
Promise.resolve(value) 用结果 value 创建一个 resolved 的 promise。

5.Promise.reject()
Promise.reject(value) 用结果 value 创建一个 rejected 的 promise。

现实中的用法

回调包装成Promise,他有两个显而易见的好处:

1、可读性好

2、返回 的结果可以加入任何Promise队列

***隐藏网址***
***隐藏网址***

由一道bilibili面试题看Promise异步执行机制的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于由一道bilibili面试题看Promise异步执行机制、由一道bilibili面试题看Promise异步执行机制的信息别忘了在本站进行查找哦。

promise的执行顺序(由一道bilibili面试题看Promise异步执行机制)

本文编辑:admin

更多文章:


excel滚动条怎么调出来(怎么让excel表格显示出滚动条)

excel滚动条怎么调出来(怎么让excel表格显示出滚动条)

今天给各位分享怎么让excel表格显示出滚动条的知识,其中也会对怎么让excel表格显示出滚动条进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!本文目录怎么让excel表格显示出滚动条Excel滚动条消失了怎么办Exc

2025年11月4日 02:30

formal的用法与搭配(formal的意思)

formal的用法与搭配(formal的意思)

大家好,今天小编来为大家解答以下的问题,关于formal的用法与搭配,formal的意思这个很多人还不知道,现在让我们一起来看看吧!本文目录formal的意思牛津高阶英语词典单词释义里(formal)是什么意思,我问的不是单词的意思怎么区分

2025年10月10日 16:45

电脑网速慢怎么解决 教你优化电脑网络速度的方法?网络优化是怎么回事

电脑网速慢怎么解决 教你优化电脑网络速度的方法?网络优化是怎么回事

其实网络优化的问题并不复杂,但是又很多的朋友都不太了解电脑网速慢怎么解决 教你优化电脑网络速度的方法,因此呢,今天小编就来为大家分享网络优化的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!本文目录电脑网速慢怎么解决 教你

2025年11月10日 12:15

take for granted(take for granted是什么意思)

take for granted(take for granted是什么意思)

各位老铁们,大家好,今天由我来为大家分享take for granted,以及take for granted是什么意思的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面

2025年10月21日 02:45

absolute error(absolute名词)

absolute error(absolute名词)

各位老铁们,大家好,今天由我来为大家分享absolute error,以及absolute名词的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!本文目录abs

2026年1月24日 00:45

免费软件下载官方网站看图(看图软件在哪里下载)

免费软件下载官方网站看图(看图软件在哪里下载)

其实免费软件下载官方网站看图的问题并不复杂,但是又很多的朋友都不太了解看图软件在哪里下载,因此呢,今天小编就来为大家分享免费软件下载官方网站看图的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!本文目录看图软件在哪里下载看

2026年9月8日 21:00

交换机power灯亮是什么意思(power灯亮是什么意思)

交换机power灯亮是什么意思(power灯亮是什么意思)

本篇文章给大家谈谈交换机power灯亮是什么意思,以及power灯亮是什么意思对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。本文目录power灯亮

2026年8月26日 10:15

汇编语言100条语句(汇编语言程序设计)

汇编语言100条语句(汇编语言程序设计)

大家好,汇编语言100条语句相信很多的网友都不是很明白,包括汇编语言程序设计也是一样,不过没有关系,接下来就来为大家分享关于汇编语言100条语句和汇编语言程序设计的一些知识点,大家可以关注收藏,免得下次来找不到哦,下面我们开始吧!本文目录汇

2025年6月28日 11:00

校验文本格式工具(文件完整性校验工具怎么用)

校验文本格式工具(文件完整性校验工具怎么用)

各位老铁们,大家好,今天由我来为大家分享校验文本格式工具,以及文件完整性校验工具怎么用的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!本文目录文件完整性校验

2025年12月8日 06:15

虚拟机安装hadoop步骤(安装hadoop 中vi命令怎么用)

虚拟机安装hadoop步骤(安装hadoop 中vi命令怎么用)

各位老铁们好,相信很多人对虚拟机安装hadoop步骤都不是特别的了解,因此呢,今天就来为大家分享下关于虚拟机安装hadoop步骤以及安装hadoop 中vi命令怎么用的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!本文目

2025年10月28日 10:45

跨域 cookie(ajax跨域请求怎样附带cookie)

跨域 cookie(ajax跨域请求怎样附带cookie)

大家好,今天小编来为大家解答以下的问题,关于跨域 cookie,ajax跨域请求怎样附带cookie这个很多人还不知道,现在让我们一起来看看吧!本文目录ajax跨域请求怎样附带cookie什么是cookie跨域问题egg.js 跨域 设置c

2026年2月6日 21:00

constant progress(it is my interest in English that contributes to my constant progress I have been making in it)

constant progress(it is my interest in English that contributes to my constant progress I have been making in it)

其实constant progress的问题并不复杂,但是又很多的朋友都不太了解it is my interest in English that contributes to my constant progress I have bee

2026年8月14日 11:30

微芯芯片是哪个国家的(芯片是哪个国家的)

微芯芯片是哪个国家的(芯片是哪个国家的)

这篇文章给大家聊聊关于微芯芯片是哪个国家的,以及芯片是哪个国家的对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。本文目录芯片是哪个国家的中兴与正和微芯是一家吗哪些国家可以制造芯片芯片是哪个国家的芯片是哪个国家的1、日本东芝(Toshi

2026年7月22日 05:30

continue语句在循环体中的作用(c语言中continue语句的作用)

continue语句在循环体中的作用(c语言中continue语句的作用)

“continue语句在循环体中的作用”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看continue语句在循环体中的作用(c语言中continue语句的作用)!本文目录c语言中continue语句的作用简述break语句和

2025年9月3日 16:45

wsdl url is not valid(php如何处理wsdl)

wsdl url is not valid(php如何处理wsdl)

大家好,关于wsdl url is not valid很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于php如何处理wsdl的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各

2026年3月9日 20:30

字符串长度可以用lenngtn吗js(js中 我在一个函数中定义一个变量赋为值空!)

字符串长度可以用lenngtn吗js(js中 我在一个函数中定义一个变量赋为值空!)

大家好,如果您还对字符串长度可以用lenngtn吗js不太了解,没有关系,今天就由本站为大家分享字符串长度可以用lenngtn吗js的知识,包括js中 我在一个函数中定义一个变量赋为值空!的问题都会给大家分析到,还望可以解决大家的问题,下面

2025年7月14日 15:45

min height threshold(div固定一个高度,但内容多了又想让div随内容的变化而变化,怎么解决)

min height threshold(div固定一个高度,但内容多了又想让div随内容的变化而变化,怎么解决)

大家好,min height threshold相信很多的网友都不是很明白,包括div固定一个高度,但内容多了又想让div随内容的变化而变化,怎么解决也是一样,不过没有关系,接下来就来为大家分享关于min height threshold和

2026年1月6日 11:30

游戏数据分析师(多玩数据(游戏产业数据分析专家))

游戏数据分析师(多玩数据(游戏产业数据分析专家))

“游戏数据分析师”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看游戏数据分析师(多玩数据(游戏产业数据分析专家))!本文目录多玩数据(游戏产业数据分析专家)一个电竞分析师关于沙盘游戏适格的分析师哪些描述是正确的新手成为游戏分

2026年3月22日 00:30

git pull和git clone(git的远程分支是干啥的,和本地的有什么区别)

git pull和git clone(git的远程分支是干啥的,和本地的有什么区别)

其实git pull和git clone的问题并不复杂,但是又很多的朋友都不太了解git的远程分支是干啥的,和本地的有什么区别,因此呢,今天小编就来为大家分享git pull和git clone的一些知识,希望可以帮助到大家,下面我们一起来

2025年11月24日 03:15

abap开发工程师要懂什么技术(软件开发人员主要做什么工作)

abap开发工程师要懂什么技术(软件开发人员主要做什么工作)

大家好,今天小编来为大家解答以下的问题,关于abap开发工程师要懂什么技术,软件开发人员主要做什么工作这个很多人还不知道,现在让我们一起来看看吧!本文目录软件开发人员主要做什么工作软件开发工程师的掌握技能(软件开发工程师需要具备的能力)软件

2026年2月25日 10:45

近期文章

本站热文

electronics软件(labcenter electronics是什么软件)
2025-05-22 23:45:02 浏览:134
博客是微博吗(博客是微博吗)
2025-05-22 22:45:01 浏览:111
diversity and distribution(悬赏英语短文)
2025-05-23 16:15:02 浏览:107
ios软件开发前景(iOS就业前景怎么样)
2025-05-22 23:00:01 浏览:102
next month(有The next month这个单词吗,和 next month有什么区别)
2025-05-23 02:30:01 浏览:102
patron(patron是什么意思)
2025-05-23 10:30:02 浏览:95
标签列表

热门搜索