Questions tagged «event-loop»

17
为什么setTimeout(fn,0)有时有用?
最近,我遇到了一个非常讨厌的错误,该错误中的代码是<select>通过JavaScript动态加载的。动态加载的<select>具有预先选择的值。在IE6中,我们已经有代码来修复selected <option>,因为有时<select>的selectedIndex值可能与selected <option>的index属性不同步,如下所示: field.selectedIndex = element.index; 但是,此代码无法正常工作。即使selectedIndex正确设置了字段,最终也会选择错误的索引。但是,如果我alert()在正确的时间插入一条语句,则会选择正确的选项。考虑到这可能是某种时序问题,我尝试了一些以前在代码中看到的随机现象: var wrapFn = (function() { var myField = field; var myElement = element; return function() { myField.selectedIndex = myElement.index; } })(); setTimeout(wrapFn, 0); 这有效! 我已经为我的问题找到了解决方案,但是我不知道为什么这可以解决我的问题,对此我感到不安。有人有官方解释吗?通过使用调用函数“稍后”可以避免出现什么浏览器问题setTimeout()?

7
Nodejs事件循环
nodejs体系结构内部是否存在两个事件循环? libev / libuv v8 javascript事件循环 在I / O请求上,节点是否将请求排队到libeio,而libeio又通过使用libev的事件通知数据的可用性,最后这些事件由v8事件循环使用回调来处理? 基本上,libev和libeio如何集成到nodejs架构中? 是否有任何文档可以清楚地了解nodejs内部体系结构?

3
事件循环上下文中微任务和宏任务之间的区别
我刚读完Promises / A +规范,偶然发现了术语microtask和macrotask:请参阅http://promisesaplus.com/#notes 我以前从未听说过这些术语,现在我很好奇可能会有什么不同? 我已经尝试过在网上找到一些信息,但是我发现的只是w3.org存档中的这篇文章(没有向我解释这些区别):http : //lists.w3.org/Archives /Public/public-nextweb/2013Jul/0018.html 另外,我发现了一个名为“ macrotask”的npm模块:https : //www.npmjs.org/package/macrotask 再次说明,到底有什么区别。 我所知道的是,它与事件循环有关,如https://html.spec.whatwg.org/multipage/webappapis.html#task-queue 和https://html.spec.whatwg中所述.org / multipage / webappapis.html#perform-a-microtask-checkpoint 鉴于此WHATWG规范,我知道理论上我应该可以自己提取差异。但是我确信,专家的简短解释也可以使其他人受益。

3
了解事件循环
我正在考虑,这是我想到的: 假设我们有这样的代码: console.clear(); console.log("a"); setTimeout(function(){console.log("b");},1000); console.log("c"); setTimeout(function(){console.log("d");},0); 一个请求进入,并且JS引擎逐步开始执行上述代码。前两个呼叫是同步呼叫。但是当涉及到setTimeout方法时,它将成为异步执行。但是JS立即从中返回并继续执行,这称为Non-Blocking或Async。并且它继续在其他等等上工作。 执行结果如下: 交流数据库 因此,基本上第二个setTimeout首先完成,其回调函数比第一个更早执行,这很有意义。 我们在这里谈论单线程应用程序。JS Engine会继续执行此操作,除非它完成第一个请求,否则它将不会转到第二个请求。但好处是它不会等待像setTimeout解析这样的阻塞操作,因此它会更快,因为它接受新的传入请求。 但是我的问题围绕以下几个方面提出: #1:如果我们在谈论单线程应用程序,那么setTimeouts当JS引擎接受更多请求并执行它们时,什么机制会处理?单线程如何继续处理其他请求?setTimeout在其他请求不断进入并被执行的同时,什么起作用。 #2:如果这些setTimeout函数在更多请求传入并正在执行时在后台执行,那么在后台执行异步执行的是什么?我们所说的这个东西叫EventLoop什么? #3:但是不应该将整个方法都放入EventLoop以便执行整个过程并调用回调方法吗?这是我在谈论回调函数时所了解的: function downloadFile(filePath, callback) { blah.downloadFile(filePath); callback(); } 但是在这种情况下,JS引擎如何知道它是否是一个异步函数,以便可以将回调函数放在EventLoop? Perhaps something like theC#中的async`关键字中或某种表明JS引擎将采用的方法的属性是异步方法并应予以相应对待。 #4:但是一篇文章说与我猜测事情可能如何运作完全相反: 事件循环是回调函数的队列。当执行异步函数时,回调函数将被推入队列。在执行异步函数后的代码之前,JavaScript引擎不会开始处理事件循环。 #5:这里有这张图片可能会有所帮助,但是图片中的第一个解释是说问题4中提到的完全相同的内容: 因此,我的问题是要对上述项目进行一些澄清?

3
Node.js事件循环滴答到底是什么?
我已经对Node.js架构的内部有了更多的了解,并且我看到了很多术语,例如“事件循环的下一个滴答”或nextTick()函数中的“滴答” 。 我还没有看到确切的定义是“滴答声”的确切含义。根据各种文章(例如本篇文章),我已经能够将一个概念拼凑起来,但是我不确定它的准确性如何。 我能否获得有关Node.js事件循环刻度的准确而详细的描述?

5
+ =的异步功能
let x = 0; async function test() { x += await 5; console.log('x :', x); } test(); x += 1; console.log('x :', x); 运行代码段隐藏结果展开摘要 已x记录的值为1和5。我的问题是:为什么x 5第二个日志的值是多少? 如果在test之后执行x += 1(因为它是异步函数),则x的值在test执行时为1 ,因此x += await 5应使的值为x 6。

2
如果浏览器不支持本机Promises,如何将微任务排队?
最好编写不依赖于立即回调的时间(例如微任务与宏任务)的代码,但是暂时不考虑它。 setTimeout将宏任务排队,该宏任务至少等待开始,直到所有微任务(以及它们产生的微任务)完成。这是一个例子: console.log('Macrotask queued'); setTimeout(function() { console.log('Macrotask running'); }); Promise.resolve() .then(function() { console.log('Microtask running'); }); console.log('Microtask queued'); console.log('Last line of script'); 运行代码段隐藏结果展开摘要 的行为.then上解决承诺是立即的行为根本不同的setTimeout回调-无极.then将首先运行,即使setTimeout是第一次排队。但是,只有现代的浏览器才支持Promises。如果不存在,如何正确填充微任务的特殊功能Promise? 如果您尝试使用来模仿.then的微setTimeout任务,则会排队执行宏任务,而不是微任务,因此,.then如果已将宏任务排入队列,则填充不良的代码将无法在正确的时间运行。 有一个使用的解决方案MutationObserver,但它看起来很丑陋,不是什么MutationObserver用。另外,MutationObserverIE10及更早版本不支持。如果要在本机不支持Promises的环境中排队微任务,还有其他更好的选择吗? (我实际上并不是在尝试支持IE10-这只是关于如何在没有Promises的情况下将微任务排队的理论练习)

1
触发1k HTTP请求的并行将卡住
问题是,当您触发1k-2k传出HTTP请求时,实际上发生了什么?我看到它可以轻松解决500个连接中的所有连接,但是从那里往上移动似乎会导致问题,因为连接保持打开状态,Node应用程序将卡在那儿。经过本地服务器+示例Google和其他模拟服务器的测试。 因此,对于某些不同的服务器端点,我确实收到了原因:读取ECONNRESET,这很好,服务器无法处理请求并抛出错误。在1k-2k的请求范围内,程序将挂起。当您检查打开的连接时,lsof -r 2 -i -a您会看到有X数量的连接一直挂在那里0t0 TCP 192.168.0.20:54831->lk-in-f100.1e100.net:https (ESTABLISHED)。当您向请求中添加超时设置时,这些设置可能最终会导致超时错误,但是为什么否则连接会一直保持下去,并且主程序最终会陷入困境? 示例代码: import fetch from 'node-fetch'; (async () => { const promises = Array(1000).fill(1).map(async (_value, index) => { const url = 'https://google.com'; const response = await fetch(url, { // timeout: 15e3, // headers: { Connection: 'keep-alive' } }); if (response.statusText !== 'OK') …
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.