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

造一个 promise-poller 轮子

前言 轮询,一个前端非常常见操作,然而对于很多人来说第一反应竟然还是用 setInterval 来实现, setInterval 作为轮询是不稳定。...刚刚也说了,setInterval 是不稳定,详见:为什么setTimeout()比setInterval()稳定。...promisify 即然这个轮子名字都带有 "promise",那 promisePoller 函数肯定要返回一个 Promise 呀。这一步就要把这个函数 promisify。...上面好像我们默认 taskFn 是同步函数呀,timeout 一般针对异步函数设计,这也提示了我们 taskFn 应该也要支持异步函数才行。...而 taskFn 有可能是同步函数或者异步函数,对于同步函数,我们规定 return false 就停止轮询,对于异步函数,规定 reject("CANCEL_TOKEN") 就停止轮询。

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

如何取消 JavaScript 中异步任务

有时候执行异步任务可能是很困难,尤其是在特定编程语言不允许取消被错误启动或不再需要操作时。幸运是 JavaScript 提供了非常方便功能来中止异步活动。...在本文中,你可以学到如何创建可中止函数。...属性是 AbortSignal DOM 接口实例,实例具有 aborted 属性,其中包含有关用户是否已调用 abortController.abort() 方法信息。...换句话说:AbortController 只是 AbortSignal 公共接口。 可终止函数 假设我们用一个异步函数执行一些非常复杂计算(例如,异步处理来自大数组数据)。...这就是创建完全可中止异步函数方式。演示可在这里获得(https://blog.comandeer.pl/assets/i-ciecie/)。请享用!

3.2K10

Node.js 中这几个场景都可以使用异步迭代器

行 {2} 根据异步可迭代协议,可迭代对象必须要包含一个 Symbol.asyncIterator 属性,属性是一个无参数函数,返回可迭代对象本身,也就是下面代码中 SymbolAsyncIterator...行 {6} eventHandler() 函数就是上面注册监听器函数 listener 当有事件触发时执行监听器函数,与异步迭代器结合就在这里,当有新事件触发时会从 unconsumedPromises...Readable 原型上定义了 SymbolAsyncIterator 属性,方法返回了一个由生成器函数创建迭代器对象。...import { setInterval } from 'timers/promises'; setInterval 几个功能点 Node.js v15.9.0 版本在 timers 模块新增了基于异步生成器函数实现...可以使用 AbortController 控制器对象中止计时器函数setInterval API 介绍 delay:两次迭代之间需要等待毫秒时间,默认 1。 value:迭代器返回值。

3.7K40

Window对象

indexedDB: 集成了为应用程序提供异步访问索引数据库功能机制。 innerHeight: 返回窗口文档显示区高度。 innerWidth: 返回窗口文档显示区宽度。...opener: 返回对创建此窗口窗口引用。 outerHeight: 返回窗口外部高度,包含工具条与滚动条。 outerWidth: 返回窗口外部宽度,包含工具条与滚动条。...confirm(): 显示带有一段消息以及确认按钮和取消按钮对话框。 focus(): 把焦点给予一个窗口。 getComputedStyle(): 获取指定元素CSS样式。...scrollTo(): 把内容滚动到指定坐标。 setInterval(): 按照指定周期来调用函数或计算表达式。 setTimeout(): 在指定毫秒数后调用函数或计算表达式。...onabort: 发送到window中止abort事件事件处理程序,不适用于Firefox 2或Safari。 窗口相关 onblur: 窗口失去焦点时触发。

2.4K20

深入理解JS异步编程(一)

setInterval() 方法和setTimeout很相似,可按照指定周期(以毫秒计)来调用函数或计算表达式。...如果队列非空,引擎就从队列头取出一个任务,直到任务处理完,即返回后引擎接着运行下一个任务,在任务没返回前队列中其它任务是没法被执行。...效果是将一个函数推迟到代码书写下一个同步方法执行完毕时或异步方法事件回调函数开始执行时;与setTimeout(fn, 0) 函数功能类似,但它效率高多了。...=function(){alert('error')} 但我们可能不知道该事件触发时还带有三个默认参数,他们分别是错误信息,错误页面的url和错误行号。...checkPassword,它触发了另一个异步函数db.query,而后者又可能触发另外一个异步函数hash。

1.1K50

Node异步IO相关知识点(二)

,第一帧被压入栈中,包含了bar参数和局部变量。...需要注意是,一个JavaScript运行时包含了一个带处理消息消息队列。每个消息都关联一个用于处理这个消息回调函数。这个可以理解为上图底部message。...所以当一个带有点击事件处理器元素被点击时,就会像其他事件一样产生一个类似的消息。 再说一下setTimeout,setTimeout函数接受两个参数:待加入队列消息(即回调函数)和一个时间值。...setTimeout()和setInterval()与浏览器中API是一致,分别用于单次和多次定时执行任务。它们实现原理与异步I/O比较类似,只是不需要I/O线程池参与。...每次Tick执行时,会从红黑树中迭代取出定时器对象,检查是否超过定时时间,如果超过,就形成一个事件,它回调函数将立即执行。

35430

Event Loop(node.js)

对应异步操作是不等待结果就继续执行后面代码操作。一般异步操作都带有一个回调函数,而回调函数操作不包括在上面说「后面代码」里,而是异步操作完成以后希望要执行操作,它们需要排队等待被执行。...异步操作回调函数排队等待被执行就算在事件循环这一阶段。...在执行完所有同步代码以后,Node.js 查看回调队列里有没有任务,有的话就执行,没有的话就等待异步操作完成,因为带有回调任务异步操作完成时会将回调任务入队到回调队列,这样就有任务可以执行了。...这里轮询事件阶段任务执行有最大次数限制。之后会细讲。 实际上事件循环里包含阶段比图上列出多,但是我们应该关心都在图上列出来了。...setTimeout、setInterval 由 setTimeout 、setInterval 调度回调任务在这里排队执行。

80120

BOM

()定时器 window.setInterval(回调函数,[延迟毫秒数]); 和 setTimeout()基本一样,不一样是,setInterval()会重复调用回调函数,每隔一段时间,就调用一次回调函数...异步任务:JS 异步时通过回调函数实现。一般有三种类型。异步任务相关回调函数放在任务队列(消息队列)中。...,通过异步进程处理, 满足条件后(即点击事件点击了,定时器事件时间到了),把异步任务(回调函数)添加到任务队列中,但是不执行 继续执行第三个任务,打印出 2; 如果执行栈中同步任务执行完后,系统会按顺序读取任务队列异步任务...执行栈中没有任务后,还会一直监听着任务队列(比如 click 事件,用户一直有点击可能),又称为”事件循环”,任务队列中有新任务,则任务进入执行栈。...它包含用户在浏览器窗口中访问 URL。

1.2K20

JavaScript中定时器工作原理(How JavaScript Timers Work)

delay 之后调用函数 fn , setTimeout 函数返回定时器唯一 id ,我们可以通过这个 id 来取消定时器执行。...图中包含大量信息,吸收并理解这些信息,能帮助我们领悟“异步 JavaScript 代码是如何工作”。 这个图是一维,垂直方向是时间,以毫秒为单位。...这就意味着,当一个异步事件发生时候(例如鼠标点击,定时器触发,一个 XMLHttpRequest 请求完成),它进入了代码执行队列,执行线程空闲时会依照执行队列中顺序依次执行代码。... interval 回调函数无间隔执行,直到执行队列清空。...setTimeout 和 setInterval 在执行异步代码时从根本上是有所不同

1.4K10

漫谈如何终止 JS 程序运行

那么便碰上了本文标题问题:如何终止 JS 程序运行? 在很多其他语言比如 PHP 当中,存在 exit 函数中止程序运行。很遗憾是 JavaScript 没有。...你可以在你程序中任意想中止地方抛出错误,然后就能达到 exit 目的。 但是,进一步思考,为什么 JavaScript 没有提供类似其他语言 exit 函数呢?...实际上,这一切都是因为 JavaScript 是单线程语言,基于代码可以异步执行考虑,才没有设置 exit 功能。那么,是不是在包含异步执行代码中,我们抛出错误方法实际上也不能立刻终止程序呢?...“you still can see me” 延迟了一秒输出,但是仍然输出了,说明我们 throw new Error 并没有立刻中止异步代码执行。...最后,我们得出结论,JavaScript 主线程同步任务可以通过抛出错误方式立即中止,但是异步任务并不会受到影响。

7.6K21

BOM概述

timeout ID就是指标识符 clearTimeout讲解: clearTimeout()方法用来取消之前设置Timeout定时器 注意: Timeout内置函数仅执行一次!...(调用函数,[延迟毫秒数]) //停止方法: window.clearInterval(Interval ID) setInterval讲解: setInterval()用来设置一个定时器 定时器在定时器到期后执行调用函数...: 同步任务都在主线程上执行,形成一个执行线 异步任务: JS异步任务都是通过回调函数执行 一般而言异步任务分为: 普通事件 : 如click,resize等 资源加载 : 如load,error...等 定时器: 包括Timeout,Interval等 因而JavaScript执行机制如下: 先执行执行栈中同步任务 异步任务(回调函数)放入任务队列中 一旦执行栈所有同步任务执行完毕,系统就会按照次序读取任务队列中异步任务...window.location.href = "http://news.baidu.com/"; } history对象 window对象给我们提供了history对象,与浏览器历史记录进行交互,对象包含了用户访问过

1.1K10

10_异常与中断

如果中止是由于指令流执行或尝试执行而产生,则中止被描述为同步,并且返回地址将提供导致中止指令详细信息。 ​...异步中止不是由执行指令生成,异步中止返回地址可能不提供导致中止原因信息。 ​ ARMv7体系结构分为精确和不精确异步中止。MMU产生中止总是同步。...对于精确异步中止中止处理程序可以确定是哪条指令导致了中止,并且在指令之后没有执行其他指令。这与不精确异步异常中止相反,异步异常中止是外部存储器系统报告有关无法识别的访问错误时结果。...如果将A位置1,CPU核将识别出外部存储系统异步异常中止,但不会产生中止异常。取而代之是,内核将中止挂起状态挂起,直到清除A位时才采取异常处理为止。...体系结构未定义何时必须采取异步异常,FIQ,IRQ或异步异常中止,但是采用IRQ或数据异常中止不会禁用FIQ异常这一事实意味着FIQ执行将优先于IRQ或异常中止异常。 ​

1.2K10

js 定时器笔记

一、定时器(timer) JavaScript提供定时执行代码功能,功能主要由setTimeout()和setInterval()这两个函数来实现 二、setTimeout() 1、使用规则 setTimeout...三、setInterval() setInterval函数用法与setTimeout完全一致,区别仅仅在于setInterval指定某个任务每隔一段时间就执行一次。...只有引擎认为某个异步任务可以执行了(比如 Ajax 操作从服务器得到了结果),任务(采用回调函数形式)才会进入主线程执行。...引用这一次,彻底弄懂 JavaScript 执行机制这篇文章解析: 同步和异步任务分别进入不同执行"场所",同步进入主线程,异步进入Event Table并注册函数。...上述过程会不断重复,也就是常说Event Loop(事件循环)。 ? 九、异步与回调函数 来源:如果没有callback函数,会先执行f2,f3函数再执行f2函数

7.3K60

JavaScript设置定时器、取消定时器及执行机制解析

等到主线程队列空了(执行完了)时候,就会去异步队列查询是否有可执行异步任务了(异步任务通常进入异步队列之后还要等一些条件才能执行,如 ajax 请求、文件读写),如果某个异步任务可以执行了便加入主线程队列...setInterval() 以固定时间间隔重复调用一个函数或者代码段: var intervalId = window.setInterval(func, delay , param1, param2...clearTimeout() 取消定时器 clearInterval() 方法可取消由 setInterval() 函数设定定时执行操作。...,使用返回标识符作为参数,可以取消 setInterval() 所设定定时执行操作。...而通过setTimeout模拟setIntervalsetInterval区别则在于:setTimeout只有在回调完成之后才会去调用下一次定时器,而setInterval则不管回调函数执行情况

4.6K10

【THE LAST TIME】彻底吃透 JavaScript 执行机制

主线程自上而下执行所有代码 同步任务直接进入到主线程被执行,而异步任务则进入到 Event Table 并注册相对应回调函数 异步任务完成后,Event Table 会将这个函数移入 Event Queue...对于执行顺序来说,setInterval会每隔指定时间将注册函数置入 Task Queue,如果前面的任务耗时太久,那么同样需要等待。...一旦 setInterval 回调函数fn执行时间超过了xx ms,那么就完全看不出来有时间间隔了。 仔细回味回味,是不是那么回事?...libuvAPI包含有时间,非阻塞网络,异步文件操作,子进程等等。 Event Loop就是在libuv中实现。...阶段将会被中止然后开始 check 阶段执行。

43520

「Web编程API」- 04

BOM构成 BOM 比 DOM 更大,它包含 DOM。 1.2.3....setTimeout() setInterval() setTimeout()炸弹定时器 开启定时器 普通函数是按照代码顺序直接调用。简单理解: 回调,就是回头调用意思。...,它有很多属性,我们最常用是 userAgent,属性可以返回由客户机发送服务器 user-agent 头部值。...对象包含用户(在浏览器窗口中)访问过URL。 history对象一般在实际开发中比较少用,但是会在一些 OA 办公系统中见到。 1.3. JS执行机制 以下代码执行结果是什么?...同步任务指的是:在主线程上排队执行任务,只有前一个任务执行完毕,才能执行后一个任务; 异步任务指的是:不进入主线程、而进入”任务队列”任务,当主线程中任务运行完了,才会从”任务队列”取出异步任务放入主线程执行

87420
领券