最好编写不依赖于即时回调的时间的代码(如微任务与宏任务),但让我们暂时将其搁置一旁。
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 的情况下排队的理论练习)
我已经做了很多的发展在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如何工作的基本问题,我不理解.
从我看到的情况来看,如果Node中的事件需要"长时间"调度,Node会创建某种"事件队列",并且会尽快逐个触发它们.
这个队列可以有多长时间?
我有一个基于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时进行上下文切换,因此额外的事件循环似乎完全没必要.
使用额外的事件循环有什么好处,何时应该使用其他循环?
问题是当您触发 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) 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,从而导致调用旧的(因此不是最新的)回调。换句话说,这可能是执行顺序:
callback。savedCallback.current(),与 …我需要知道ios生命周期中的事件循环是什么吗?任何人都可以建议我这个吗?
我的Eclipse用于开发Android应用程序.它工作正常,直到有一天,一个Unhandled事件循环异常是提示.日志如下所示.
要触发错误提示,只需将文本编辑器在eclipse中取消聚焦并再次聚焦,然后触发提示,例如,单击Package explorer(红色圆圈)并单击Main.java中的代码(绿色圆圈).日食.(.xml是相同的).
但是,如果我通过单击Package Explorer(红色圆圈)取消代码的焦点,然后单击代码的标题(蓝色圆圈),然后单击代码(绿色圆圈),将不会提示错误.
PS使用Eclipse可以编译Android应用程序并在设备中正常工作.但错误提示非常烦人.
![在此处输入图像说明] [1]
我试过了:
从Android开发人员下载新的ADT(Eclipse)表单并解压缩它,不工作,仍然没有更多的句柄
下载Eclipse Standard 4.3.1并解压缩,无法正常工作
重启计算机,重启Eclipse.不工作
创建一个新的Windows 7帐户,并使用新帐户打开相同的eclipse(在旧帐户中抛出错误)与相同的工作区,它的工作原理.没有例外.
我试图用C:\ oldUser.android替换C:\ oldUser.android,旧用户仍然例外
更改首选项>常规>编辑器>文件关联>*.xml和Android Manifest中的默认编辑器,无法正常工作
在Eclipse中重置透视图,无法正常工作
更改工作区并使用新工作区,而不是工作
我想使用旧用户帐户正确打开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) 在 JavaScript 中,事件循环用于引擎中。下面是一张图表来说明这篇文章。

(来源:mybalsamiq.com)
对于 Node.js,事件循环也在此处实现。引用这个问题。
Node.js 事件循环在单线程下运行,这意味着您编写的应用程序代码在单线程上进行评估。Nodejs 本身通过 libuv 使用了许多线程,但是在编写 nodejs 代码时您永远不必处理这些线程。
然而,关于 node.js 事件循环对我来说仍然是抽象的。
在以下代码中:
setTimeout(() => console.log("hello"), 0);
Promise.resolve('Success!')
.then(console.log)
Run Code Online (Sandbox Code Playgroud)
在我的理解中应该发生什么:
print hello直接添加到回调队列,因为时间为 0print Success!添加到回调队列如果我没记错的话,回调队列是FIFO。
但是代码输出是:
Success!
hello
Run Code Online (Sandbox Code Playgroud)
解释是什么?
event-loop ×10
javascript ×5
node.js ×3
promise ×2
.net ×1
async-await ×1
asynchronous ×1
debugging ×1
eclipse ×1
eventmachine ×1
exception ×1
handles ×1
iphone ×1
objective-c ×1
python ×1
python-3.x ×1
react-hooks ×1
reactjs ×1
ruby ×1
terminology ×1