首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

深入理解 Promise 之手把手教你写一版

promise2 的状态凝固 监听或执行对应的 onFulfilled/onRejected 回调函数 若是执行则需放入 event-loop 监听只需推入回调函数数组 上述的 resolvePromise...callbacks 数组 this.onFulfilledCallbacks.push(value => { // 配置第一步:执行 callback...我们需要将它捕获并将 promise2 的状态改为 rejected,我们代码再做修改: then(onFulfilled, onRejected) { let promise2...return (promise2 = new MyPromise((resolve, reject) => { // 将回调函数配置好并推入对应的 callbacks 数组...最后只剩下一个 resolvePromise 方法,先介绍一下它的功能:根据回调函数的返回 x 决定 promise2 的最终状态: 如果 x 为 thenable 对象,即带 then 方法的对象

50510

Promise面试题2实现异步串行执行

按照要求: 实现 mergePromise 函数,把传进去的函数数组按顺序先后执行,并且把返回的数据先后放到数组 data 。...按题目的要求我们只要顺序执行这三个函数就好了,然后把结果放到 data ,但是这些函数里都是异步操作,想要按顺序执行,然后输出 1,2,3并没有那么简单,看个例子。..., // 第二次的 then 方法接受数组的函数执行后返回的结果, // 并把结果添加到 data 然后把 data 返回。...data, // 而 data(保存数组的函数执行后的结果) 也会作为参数,传入下次调用的 then 方法。...,并且执行结果推入data数组,最后更新的data返回,这样保证后面sequence调用then方法,如何后面的函数需要使用data只需要将函数改为带参数的函数。

1.5K51
您找到你想要的搜索结果了吗?
是的
没有找到

前端高频手写面试题总结

然后再重新分隔成数组。...在编程过程,如果数组嵌套层数不确定,最好直接使用 Infinity,可以达到扁平化。...(6)正则和 JSON 方法 在第4种方法已经使用 toString 方法,其中仍然采用了 JSON.stringify 的方法先转换为字符串,然后通过正则表达式过滤掉字符串数组的方括号,最后再利用...} return res;}使用 setTimeout 实现 setIntervalsetInterval 的作用是每隔一段指定时间执行一个函数,但是这个执行不是真的到了时间立即执行,它真正的作用是每隔一段时间事件加入事件队列中去...针对 setInterval 的这个缺点,我们可以使用 setTimeout 递归调用来模拟 setInterval,这样我们就确保了只有一个事件结束了,我们才会触发下一个定时器事件,这样解决了 setInterval

2.2K20

【JS】779- 深入理解Promise

这是布兰的第 7 篇原创 异步编程说起 我们都知道 JavaScript 的代码执行的时候是跑在单线程上的,可以理解为只能按照代码的出现顺序,从上到下一行一行的执行,但是遇到了异步的行为,比如定时器(...Promise 实例的 then 和 catch 函数多层嵌套的代码改成了同步处理流程,看起来效果还是不错的,那什么是 Promise 呢?...A 推入微任务队列 1; 执行 resolve(2),处理程序 C 推入微任务队列 2; 同步任务执行完成,执行微任务队列 1 里的内容,打印 A,A 所在函数执行完成后生成了一个 fulfilled...Promise.allSettled() Promise.allSettled(iterable) 当所有的实例都已经 settled,即状态变化过了,那么返回一个新实例,该新实例的内部是由所有实例的和状态组合成的数组...,数组的每项是由每个实例的状态和组成的对象。

1.1K10

用javascript分类刷leetcode13.单调栈(图文视频讲解)_2023-02-28

n行形成的柱状图可以利用84题求解,然后循环每一行,计算以这一行为底的柱状图最大面积,然后更新最大矩形面积 复杂度:时间复杂度O(mn),m、n分别是矩形的高度和宽度,循环m次行,每行里循环每个柱子的高度...所以这个数就是这些出栈元素的下一个更大的数 剩下来的元素就是没有找到最大的 遍历nums1结果推入ans 复杂度:时间复杂度O(m+n),nums1、nums2遍历一遍,nums2的元素入队出队一次...nums1.forEach(item => ans.push(map.get(item)));//遍历nums1结果推入ans return ans; }; 239....,具体就是维护一个大顶堆,初始的时候0~k-1的元素加入堆,存入的是和索引的键值队,然后滑动窗口索引为k的元素开始遍历,新进入滑动窗口的元素加堆,当堆顶元素不在滑动窗口中的时候,不断删除堆顶堆元素...该方法要循环整个数组,并且每个位置要遍历数组寻找左右柱子高度的最大嵌套了一层循环,所以复杂度是O(n^2)。

63240

JavaScript各种定时器总结

需要先将其display改为非none的然后插入class实现动画执行。这个时候如果你的元素直接加入一个class,这个class同一时间display设置成block,然后同时启动动画。...这个时候一般解决方式都是先将元素的display改为block,然后setTimeout里面加入为元素添加class的代码,并且延时0毫秒。我相信不少人会这么做,这个也是比较方便和常规的做法。...了,那么执行,否则放到下一次的任务队列。...很简单的一例子,如果使用setInterval,里面的回调函数,需要执行比较长的事件,例如setInterval一个1秒钟的时间,然后callback需要执行3秒,那么下一个setInterval并不会等待上一个的...其实我们经常用setTimeout元素的display改为block,然后添加动画class也是会有bug的,例如我们定时任务修改完了元素的display属性,但是浏览器并没有刷新整个dom的结构,你就添加了

61420

用javascript分类刷leetcode13.单调栈(图文视频讲解)_2023-02-27

,具体就是维护一个大顶堆,初始的时候0~k-1的元素加入堆,存入的是和索引的键值队,然后滑动窗口索引为k的元素开始遍历,新进入滑动窗口的元素加堆,当堆顶元素不在滑动窗口中的时候,不断删除堆顶堆元素...n行形成的柱状图可以利用84题求解,然后循环每一行,计算以这一行为底的柱状图最大面积,然后更新最大矩形面积 复杂度:时间复杂度O(mn),m、n分别是矩形的高度和宽度,循环m次行,每行里循环每个柱子的高度...所以这个数就是这些出栈元素的下一个更大的数 剩下来的元素就是没有找到最大的 遍历nums1结果推入ans 复杂度:时间复杂度O(m+n),nums1、nums2遍历一遍,nums2的元素入队出队一次...nums1.forEach(item => ans.push(map.get(item)));//遍历nums1结果推入ans return ans; }; 42....该方法要循环整个数组,并且每个位置要遍历数组寻找左右柱子高度的最大嵌套了一层循环,所以复杂度是O(n^2)。

63030

前端js手写题经常忘,记录一下

然后再重新分隔成数组。...在编程过程,如果数组嵌套层数不确定,最好直接使用 Infinity,可以达到扁平化。...(6)正则和 JSON 方法 在第4种方法已经使用 toString 方法,其中仍然采用了 JSON.stringify 的方法先转换为字符串,然后通过正则表达式过滤掉字符串数组的方括号,最后再利用...arr;}思想: 双重 for 循环是比较笨拙的方法,它实现的原理很简单:先定义一个包含原始数组第一个元素的数组然后遍历原始数组原始数组的每个元素与新数组的每个元素进行比对,如果不重复则添加到新数组...针对 setInterval 的这个缺点,我们可以使用 setTimeout 递归调用来模拟 setInterval,这样我们就确保了只有一个事件结束了,我们才会触发下一个定时器事件,这样解决了 setInterval

95240

用javascript分类刷leetcode13.单调栈(图文视频讲解)

n行形成的柱状图可以利用84题求解,然后循环每一行,计算以这一行为底的柱状图最大面积,然后更新最大矩形面积复杂度:时间复杂度O(mn),m、n分别是矩形的高度和宽度,循环m次行,每行里循环每个柱子的高度...该方法要循环整个数组,并且每个位置要遍历数组寻找左右柱子高度的最大嵌套了一层循环,所以复杂度是O(n^2)。...,具体就是维护一个大顶堆,初始的时候0~k-1的元素加入堆,存入的是和索引的键值队,然后滑动窗口索引为k的元素开始遍历,新进入滑动窗口的元素加堆,当堆顶元素不在滑动窗口中的时候,不断删除堆顶堆元素...动画过大,点击查看思路:循环nums2,如果循环的元素大于栈顶元素,并且栈不为空,则不断栈顶元素作为key,当前元素作为value加入map本质是第一个比栈顶元素大的会让栈的元素不断出队 所以这个数就是这些出栈元素的下一个更大的数剩下来的元素就是没有找到最大的遍历...nums1结果推入ans复杂度:时间复杂度O(m+n),nums1、nums2遍历一遍,nums2的元素入队出队一次。

56410

动图学JS异步: Promises & AsyncAwait

在JavaScript事件循环[2],我们不是也可以使用原生浏览器的方法,如setTimeout来实现某种异步行为? 是的!...•Task5, Task6: 一个 (macro)task队列, 比如像一个setTimeout or setImmediate回调函数。 ? 首先Task1执行完毕后返回一个然后调用堆栈弹出。...然后事件循环会去检查microtasks中排队的队列,然后按照顺序依次microtasks任务出队,弹入到调用堆栈,执行,弹出,直到清空microtasks。...他们都是内部方法,实际上不会出现在stack trace, - 所以不要担心,如果你使用调试器,你在任何地方都看不到他们!它只是辅助我们容易理解事件循环概念?...在第一行,事件循环执行到console.log()方法,它将被添加到调用堆栈,之后执行打印出Start!到控制台。然后该方法调用堆栈弹出,事件循环继续执行。 ?

1.1K20

重学JavaScript Promise API

在实际场景,我们可能会进行Ajax调用,用结果更新DOM,然后等待动画完成。或者,我们的服务器可能从客户端接收输入,验证输入,更新数据库,写入日志文件,最后发送响应。...使用嵌套回调来完成这样的任务是非常痛苦的。幸运的是,Promise为我们提供了一种简洁的语法,使我们能够异步命令串联起来,让它们一个接一个地运行。...传递给Promise构造函数的回调包含用于远程服务获取数据的异步代码。...向下传递数据 当我们需要执行多个异步操作时,我们可能希望一个异步调用的结果传递给Promise链下一个then,这样我们就可以对该数据进行处理。...例如,我们可能想要获取 GitHub 仓库的贡献者列表,然后使用该信息获取第一位贡献者的姓名: fetch('<https://api.github.com/repos/eslint/eslint/contributors

14320

javascript入门到进阶 - js系列一:三种基本的数据结构

」那么数组是怎么样获取元素的呢:我们当然可以使用索引的方式: var arr = ["ken","Ken","coding"]; arr[0] ==> 栈底 arr[1] arr[2] ==> 栈顶...(3)当执行完这个函数后,如果它没有调用其他函数,则它会调用栈推出。然后调用栈继续运行其他部门。...(4) 异步函数的回调函数一般都会被添加到运行队列里面,如settimeout会在响应的时间后把回调函数放入队列,队列里的函数需要等栈为空时才会被推入执行。..."); //表示还剩 (tail - head)的数据 进行数据搬移 队头的下标改为0开始 入队时保证了数组的连续性 for (int i..."); //表示还剩 (tail - head)的数据 进行数据搬移 队头的下标改为0开始 入队时保证了数组的连续性 for (int i = head; i <

65120

Promise 详解

为什么需要Promise 在前端开发,我们经常都会使用 setTimeout, XHR等方式进行异步调用,比如以下一个简单请求例子: //ajax 是封装的XHR请求函数,此处省略具体实现 ajax(...并不是单一的数据请求,往往会遇到下一个请求依赖前置的请求。...比如我们先要获取商品的信息id, 然后去查询详情数据,我们通常处理会如下: ajax({method: 'GET', url: '/get', data: { id: 'xxx' } }, (...假定onResovle返回为returnVal,分为以下两种情况: 如果returnVal不为Promise对象,那么使用returnVal作为then 返回的新Promise的。...Promises数组; 其次返回对象为Promise 对象,并且返回对象Promise的数据为执行promise 数组; 如果promises 数组1个执行失败,则返回Promise状态和失败

46620

用 JavaScript 实现寻路算法 —— 编程训练

JavaScript 数组就是天然的队列 (Queue),同时 JavaScript 数组也是天然的栈 (Stack)。...(JavaScript 我们使用数组即可) 编写一个 “入队” 的方法,条件是如果遇到边缘或者障碍就直接跳出方法,这些都是不可走的格子所以不会加入我们的队列。...循环我们队列可以走的格子,这里的主要目标就是把所有记录了可以走的格子都找到它的 上,下,左,右,并且把这些可走的格子都入队列,然后进入下一个循环时就会去找这些新入队列的格子可以走到哪里,然后把后面找到的格子再次入队列...// 这里我们用一个小技巧,把数组里面最后一位的挪动到当前发现最小的位置 // 最后使用 pop 把最后一位数据移除 this.data[minIndex] = this.data...把所有入队列和出队列的调用改为使用 Sorted 类里面的 take 取值 和 give 插入函数 其他地方基本就没有什么改变了 接下来我们来看看代码是怎么实现的: // 上一部分的代码,这里就忽略了

1.1K20

来45道Promise面试题一次爽到底(1.1w字用心整理)

这篇文章是一篇比较纯的Promise笔试文章,是我自己在做题的时候,根据题目想要的考点来反敲知识点,然后再由这个知识点编写浅到深的的题目。...从上至下,先遇到new Promise,执行该构造函数的代码1 然后碰到了定时器,这个定时器的函数放到下一个宏任务的延迟队列中等待执行 执行同步代码2 跳出promise函数,遇到promise.then...,promise的状态改为resolved且保存结果并将之前的promise.then推入微任务队列 继续执行同步代码timerEnd 宏任务全部执行完毕,查找微任务队列,发现promise.then...第一轮宏任务执行结束,并且没有微任务需要执行,因此执行第二轮宏任务 先执行第一个定时器里的内容,promise1的状态改为resolved且保存结果并将之前的promise1.then推入微任务队列...遇到了一个定时器,先将它放到下一个宏任务队列里不管它,接着向下走 碰到了resolve(1),这里就把p的状态改为了resolved,且返回为1,不过这里也先不执行 跳出p,碰到了resolve(2)

1.5K20

手写Promise完整介绍

Promise可以通过resolve方法状态pending变为fulfilled,并传递一个作为成功的结果;也可以通过reject方法状态pending变为rejected,并传递一个原因作为失败的结果...如果是,那么状态改为FULFILLED并将返回赋给value属性,并依次调用成功回调数组的回调函数。在reject函数,同样首先判断promise的当前状态是否为PENDING。...如果是,那么状态改为REJECTED并将错误原因赋给reason属性,并依次调用失败回调数组的回调函数。在构造函数的末尾,通过try-catch语句执行executor函数。...resolve方法状态pending变为fulfilled,并传递一个作为成功的结果;reject方法状态pending变为rejected,并传递一个原因作为失败的结果。...数组

38830

C语言的几个标准库

30 int fgetc(FILE *stream)指定的流 stream 获取下一个字符(一个无符号字符),并把位置标识符往前移动。...34 int getc(FILE *stream)指定的流 stream 获取下一个字符(一个无符号字符),并把位置标识符往前移动。...35 int getchar(void)标准输入 stdin 获取一个字符(一个无符号字符)。...36 char *gets(char *str)标准输入 stdin 读取一行,并把它存储在 str 所指向的字符串。当读取到换行符时,或者到达文件末尾时,它会停止,具体视情况而定。...换行符会被追加到输出。 40 int ungetc(int char, FILE *stream)把字符 char(一个无符号字符)推入到指定的流 stream ,以便它是下一个被读取到的字符。

3.7K10

Js面试题__附答案

在字符串语句中可以通过在第一行末尾使用反斜杠“\”来完成 例:document.write("This is \a program"); 如果不是在字符串语句中更改为新行,那么javaScript会忽略行的断点...“==”仅检查相等,而“===”是一个严格的等式判定,如果两个变量的或类型不同,则返回false。 17、3 + 2 +“7”的结果是什么? 由于3和2是整数,它们直接相加。...pop()方法与shift()方法类似,但不同之处在于Shift方法在数组的开头工作。此外,pop()方法最后一个元素给定的数组取出并返回。然后改变被调用的数组。...Break语句当前循环中退出。 continue语句继续下一个循环语句。 29、在JavaScript,dataypes的两个基本组是什么?...这通常意味着这些函数可以作为参数传递给其他函数,作为其他函数的返回,分配给变量,也可以存储在数据结构嵌套函数:在其他函数定义的函数称为嵌套函数。 54、解释unshift()方法?

8.8K30

37个JavaScript基本面试问题和解答(建议收藏)

在大多数情况下,这是所希望的行为,因为数组确实是对象,但是在您想要对数组也是false的情况下,可以将上述解决方案修改为: console.log((bar !...当值为零作为setTimeout()的第二个参数传递时,它将尝试“尽快”执行指定的函数。具体来说,函数的执行放置在事件队列,以在下一个计时器滴答时发生。...10、编写一个简单的函数(少于160个字符),返回一个布尔,指示字符串是否是palindrome。 如果str是回文,以下一行函数返回true;否则,它返回false。...这里有几个观点可以让人们回答这个问题: 数组传递给另一个数组的push()方法会将整个数组作为单个元素推入数组的末尾。...该代码输出以下四行: 0 || 1 = 11 || 2 = 10 && 1 = 01 && 2 = 2 在JavaScript,都是||和&&是逻辑运算符,当左向右计算时返回第一个完全确定的“逻辑

3K10
领券