标签: event-loop

如果浏览器不支持原生 Promise,如何将微任务排队?

最好编写不依赖于即时回调的时间的代码(如微任务与宏任务),但让我们暂时将其搁置一旁。

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');
Run Code Online (Sandbox Code Playgroud)

a.then在已解决的 Promise 上的行为与立即setTimeout回调的行为有根本的不同——Promise.then将首先运行,即使Promise 已先setTimeout排队。但只有现代浏览器支持 Promises。如果微任务的特殊功能Promise不存在,如何正确填充它?

如果您尝试使用 模仿.then的微setTimeout任务,您将排队一个宏任务,而不是一个微任务,因此.then如果宏任务已经排队,那么糟糕的polyfill将不会在正确的时间运行。

有一个使用 的解决方案MutationObserver,但它看起来很难看,而且不是MutationObserver用来做什么的。此外,MutationObserver在 IE10 及更早版本上不支持。如果想要在原生不支持 Promises 的环境中排队一个微任务,有没有更好的选择?

(我实际上并不是尝试支持 IE10 - 这只是关于微任务如何在没有 Promise 的情况下排队的理论练习)

javascript event-loop promise

11
推荐指数
2
解决办法
502
查看次数

为什么异步I/O需要事件循环

我已经做了很多的发展在C#/.Net和异步的故事一直存在从一开始(诚然API的已超过从开始/结束事件的年显著改变,以Task<T>async/ await).在过去一年左右的时间里,我一直在使用Node.js进行开发,它以异步方式执行所有I/O并使用单线程事件循环模型.最近我正在开发一个我们使用Ruby的项目,对于应用程序的一部分,我觉得以异步方式制作一大堆Web请求是有意义的,并且惊讶地发现Ruby中的异步故事非常多不同.执行任何异步I/O的唯一方法是使用EventMachine.

我的问题归结为:为什么在.Net(以及我可以告诉它对Java/JVM也是如此)不需要事件循环,我可以随时触发异步请求但是在像Ruby/Python这样的语言中,我需要分别使用eventmachine/twisted?我觉得有一些关于异步I/O如何工作的基本问题,我不理解.

.net ruby asynchronous event-loop eventmachine

10
推荐指数
1
解决办法
2204
查看次数

node.js可以排队多少个事件?

从我看到的情况来看,如果Node中的事件需要"长时间"调度,Node会创建某种"事件队列",并且会尽快逐个触发它们.

这个队列可以有多长时间?

javascript message-queue event-loop node.js

10
推荐指数
1
解决办法
4546
查看次数

何时使用多个事件循环?

我有一个基于Python 3.5+异步框架(apistar,sanic等)构建的Web应用程序.该应用程序进行各种IO调用 - 数据库,Redis等 - 也是异步的.

有些文档建议使用其他事件循环:

import asyncio
import peewee
from peewee_async import Manager, PostgresqlDatabase

loop = asyncio.new_event_loop() # Note: custom loop!
database = PostgresqlDatabase('test')
objects = Manager(database, loop=loop)
Run Code Online (Sandbox Code Playgroud)

我的理解是await语句允许事件循环在上传IO时进行上下文切换,因此额外的事件循环似乎完全没必要.

使用额外的事件循环有什么好处,何时应该使用其他循环?

python event-loop python-3.x async-await python-asyncio

10
推荐指数
2
解决办法
2240
查看次数

触发并行 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') {
      console.log('No ok received', index);
    } …
Run Code Online (Sandbox Code Playgroud)

event-loop node.js

10
推荐指数
1
解决办法
232
查看次数

“官方” useInterval 示例中的潜在错误

使用间隔

useInterval来自Dan Abramov 的这篇博文(2019 年)

function useInterval(callback, delay) {
  const savedCallback = useRef();

  // Remember the latest callback.
  useEffect(() => {
    savedCallback.current = callback;
  }, [callback]);

  // Set up the interval.
  useEffect(() => {
    function tick() {
      savedCallback.current();
    }
    if (delay !== null) {
      let id = setInterval(tick, delay);
      return () => clearInterval(id);
    }
  }, [delay]);
}
Run Code Online (Sandbox Code Playgroud)

一个潜在的错误

可以在提交阶段和调用之间调用间隔回调useEffect,从而导致调用旧的(因此不是最新的)回调。换句话说,这可能是执行顺序:

  1. 渲染阶段- 的新值callback
  2. 提交阶段- 提交给 DOM 的状态。
  3. 使用布局效果
  4. 间隔回调- using savedCallback.current(),与 …

javascript event-loop reactjs react-hooks

10
推荐指数
1
解决办法
503
查看次数

什么是ios生命周期中的事件循环,它的用途和用途是什么?

我需要知道ios生命周期中的事件循环是什么吗?任何人都可以建议我这个吗?

iphone terminology objective-c event-loop

9
推荐指数
1
解决办法
6549
查看次数

Eclipse Unhandled事件循环异常,不再处理Windows 7

我的Eclipse用于开发Android应用程序.它工作正常,直到有一天,一个Unhandled事件循环异常是提示.日志如下所示.

要触发错误提示,只需将文本编辑器在eclipse中取消聚焦并再次聚焦,然后触发提示,例如,单击Package explorer(红色圆圈)并单击Main.java中的代码(绿色圆圈).日食.(.xml是相同的).

但是,如果我通过单击Package Explorer(红色圆圈)取消代码的焦点,然后单击代码的标题(蓝色圆圈),然后单击代码(绿色圆圈),将不会提示错误.

PS使用Eclipse可以编译Android应用程序并在设备中正常工作.但错误提示非常烦人.

![在此处输入图像说明] [1]

我试过了:

  1. 从Android开发人员下载新的ADT(Eclipse)表单并解压缩它,不工作,仍然没有更多的句柄

  2. 下载Eclipse Standard 4.3.1并解压缩,无法正常工作

  3. 重启计算机,重启Eclipse.不工作

  4. 创建一个新的Windows 7帐户,并使用新帐户打开相同的eclipse(在旧帐户中抛出错误)与相同的工作区,它的工作原理.没有例外.

  5. 我试图用C:\ oldUser.android替换C:\ oldUser.android,旧用户仍然例外

  6. 更改首选项>常规>编辑器>文件关联>*.xml和Android Manifest中的默认编辑器,无法正常工作

  7. 在Eclipse中重置透视图,无法正常工作

  8. 更改工作区并使用新工作区,而不是工作

我想使用旧用户帐户正确打开Eclipse.真奇怪.请帮忙.非常感谢你!!

org.eclipse.swt.SWTError: No more handles
    at org.eclipse.swt.SWT.error(SWT.java:4387)
    at org.eclipse.swt.SWT.error(SWT.java:4276)
    at org.eclipse.swt.SWT.error(SWT.java:4247)
    at org.eclipse.swt.widgets.Widget.error(Widget.java:468)
    at org.eclipse.swt.widgets.Control.createHandle(Control.java:704)
    at org.eclipse.swt.widgets.Label.createHandle(Label.java:199)
    at org.eclipse.swt.widgets.Control.createWidget(Control.java:744)
    at org.eclipse.swt.widgets.Control.<init>(Control.java:112)
    at org.eclipse.swt.widgets.Label.<init>(Label.java:101)
    at org.eclipse.ui.texteditor.StatusLineContributionItem.fill(StatusLineContributionItem.java:182)
    at org.eclipse.jface.action.SubContributionItem.fill(SubContributionItem.java:59)
    at org.eclipse.jface.action.StatusLineManager.update(StatusLineManager.java:327)
    at org.eclipse.ui.internal.WorkbenchPage.updateActivations(WorkbenchPage.java:265)
    at org.eclipse.ui.internal.WorkbenchPage.access$15(WorkbenchPage.java:243)
    at org.eclipse.ui.internal.WorkbenchPage$E4PartListener.partActivated(WorkbenchPage.java:172)
    at org.eclipse.e4.ui.internal.workbench.PartServiceImpl$2.run(PartServiceImpl.java:193)
    at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
    at org.eclipse.e4.ui.internal.workbench.PartServiceImpl.firePartActivated(PartServiceImpl.java:191)
    at org.eclipse.e4.ui.internal.workbench.PartServiceImpl.activate(PartServiceImpl.java:596)
    at org.eclipse.e4.ui.internal.workbench.PartServiceImpl.activate(PartServiceImpl.java:549)
    at org.eclipse.e4.ui.internal.workbench.swt.AbstractPartRenderer.activate(AbstractPartRenderer.java:105)
    at org.eclipse.e4.ui.workbench.renderers.swt.ContributedPartRenderer$1.handleEvent(ContributedPartRenderer.java:61)
    at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
    at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1053)
    at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1077)
    at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1058) …
Run Code Online (Sandbox Code Playgroud)

eclipse debugging exception handles event-loop

9
推荐指数
1
解决办法
3万
查看次数

JavaScript 事件循环和 Node.js 事件循环有什么区别?

在 JavaScript 中,事件循环用于引擎中。下面是一张图表来说明这篇文章


(来源:mybalsamiq.com

对于 Node.js,事件循环也在此处实现。引用这个问题

Node.js 事件循环在单线程下运行,这意味着您编写的应用程序代码在单线程上进行评估。Nodejs 本身通过 libuv 使用了许多线程,但是在编写 nodejs 代码时您永远不必处理这些线程。

然而,关于 node.js 事件循环对我来说仍然是抽象的。

  • 有没有图片可以更清楚的介绍一下?
  • 这两个事件循环有什么不同?

javascript event-loop node.js

9
推荐指数
2
解决办法
5336
查看次数

JavaScript 异步回调 - Promise 和 setTimeout

在以下代码中:

setTimeout(() => console.log("hello"), 0);

Promise.resolve('Success!')
  .then(console.log)
Run Code Online (Sandbox Code Playgroud)

在我的理解中应该发生什么:

  1. setTimeout 被调用 =>print hello直接添加到回调队列,因为时间为 0
  2. Promise.resolve =>print Success!添加到回调队列

如果我没记错的话,回调队列是FIFO

但是代码输出是:

Success!
hello
Run Code Online (Sandbox Code Playgroud)

解释是什么?

javascript event-loop promise

9
推荐指数
2
解决办法
733
查看次数