- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我正在处理 a JavaScript library除其他外,它提供了可异步迭代的序列上的 map/reduce 函数。
一个 helpful soul on GitHub建议对于 Node.js,我应该使用 process.nextTick
尽可能快地进行异步迭代。 (该库目前在所有环境中都使用 setTimeout
,我确实理解这是次优的。)我对 Node 非常缺乏经验,所以我正在阅读这种方法的工作原理,但事实并非如此我不清楚这是否是一个好的选择。
根据the answer to another question on SO ,似乎在这种情况下使用 setImmediate
可能更有意义,因为 nextTick
显然会跳过待处理的 I/O 事件 ahead,这对我来说似乎很糟糕。
the official Node v0.10.0 announcment 中的一些评论似乎证实了这一点。 :
In v0.10,
nextTick
handlers are run right after each call from C++ into JavaScript. That means that, if your JavaScript code callsprocess.nextTick
, then the callback will fire as soon as the code runs to completion, but before going back to the event loop.
我是对的,异步迭代序列应该使用 setImmediate
完成吗?或者 nextTick
会是更好的选择吗? (无论哪种情况,我们都非常感谢您对为什么做出清晰的解释。)
最佳答案
一些注意事项:
我会首先对扩展 setImmediate 比 process.nextTick
慢的地方进行严格的基准测试。如果它不是(很多)慢,我会立即使用 setImmediate
,因为这不会使事件循环饿死。
在 Node 0.10 中有一个硬性限制(1000,参见 node.js docs),您可以递归调用 nextTick 的次数,因此在任何情况下都应该防止这种情况发生。您要么需要在迭代之前选择策略,要么能够在迭代期间更改策略(同时检查当前迭代计数)。
如果您出于性能原因选择 process.nextTick,您可能需要设置一个可配置的硬限制,它会连续执行 process.nextTick
的次数,否则切换到 立即设置
。我没有在 nodejs 上进行大量工作负载的经验,但我认为如果你的库使他们的 I/O 不稳定,人们不会喜欢它。
setImmediate 肯定是最安全的,总而言之。
关于浏览器:我没有研究过您的库,但由于您实际上来自 setTimeout
,因此您可能会通过 window.postMessage
帮助您了解新型延迟技术以及其他什么.有一个不错的小型库,名为 next-tick (但语义与 Node next-tick 不同!)并且有一个 cross-browser shim for setImmediate ,这有点重,因为 1)它需要实现 setImmediate 规范(包括取消计划任务的能力)和 2)它具有更广泛的浏览器兼容性。
看看这个async sorting demo将 setImmediate (shim) 与 setTimeout 进行比较。
关于javascript - 我应该使用 process.nextTick 还是 setImmediate 进行异步迭代?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16659037/
当在代码中更新了数据,并希望等到对应的Dom更新之后,再执行一些逻辑。这时,我们就会用到$nextTick ?
我是 Vue js 新手,我试图理解方法中使用 nextTick 的逻辑。所以我有两个这样的组件: IsTuruIslem.vue ... ... .
如果我有这样的代码: class SomeClass constructor: -> @someAttr = false someFunction: -> process.ne
我正在尝试测试我的应用程序在连续两次 tick 上发生的情况。这是我目前所拥有的(测试在 karma devtools 中失败,但在命令行中失败): import { mount } from 'av
我偶然发现了一个函数( here on SO ),它可以写入文件,但确保不会覆盖文件: function writeFile(i){ var i = i || 0; var fileN
我有一个 我有一个已安装的方法,可以在其中初始化 map 。 mounted(){ this.map = L.map(this.mapId, { preferCanvas: true }).setV
尝试递归调用同步函数来解析数组的元素;一旦到达数组的最后一个元素,就会调用回调。但是,当传递给 process.nextTick 时,回调被认为是未定义的,因为在与回调相同的范围内声明的另一个变量会打
我有一个 50k 条目的列表,我正在输入我的数据库。 var tickets = [new Ticket(), new Ticket(), ...]; // 50k of them tickets.f
下面的程序会在 NodeJS 中挂起,有人知道为什么吗? ended = false;events = require('events');eventEmitter = new events.Even
Node.js 版本 0.10 今天发布,并引入了 setImmediate。 API changes文档建议在执行递归 nextTick 调用时使用它。 来自什么MDN says它看起来与proce
我应该多久或何时使用 process.nextTick ? 我明白它的目的(主要是因为 this 和 this )。 根据经验,当我必须调用回调时,我总是使用它。这是一般方法还是还有其他方法? 此外,
更新:事实证明这是一个非常愚蠢的问题。我只是没有注意到引用的示例中的一些简单的事情。 我一直在查看有关滴答声和事件循环的信息,大部分内容都很清楚,但 the nextTick documentatio
下面是“practise01.js”文件中的代码, function fn(name){ return f; function f(){ var n = name;
Node.js 0.10 版今天发布,引入了setImmediate。 API changes文档建议在进行递归 nextTick 调用时使用它。 来自MDN says它似乎与 process.nex
我读过 nextTick 允许在下一个操作中执行代码。但这在我的代码中不起作用,有人可以帮助我吗?请纠正我。谢谢。 .vue ..... methods:{ getUserInfo(){
使用 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/EventLoop 中的视觉表示: setImmediate() 和
我从人们那里得到的印象是...除非与 process.nextTick 一起使用,否则所有 JavaScript 函数都是同步的。什么时候使用它最好? 我想确保我不会在不需要它的地方过度使用它。在这一
无论好坏,我们 stub process.nextTick 以同步调用它的第一个参数(回调)。看代码: global.test_clock = sinon.useFakeTimers(); sinon
我正在尝试测试此 site 中找到的 Yahoo API。但是,我可以获得“请求 token ”,但我似乎不知道如何继续,因为我的应用程序抛出 process.nextTick 错误 此外,如果可能的
我遇到了这个express.js路线,它是 small example in its official repo 的一部分,演示如何处理错误,看看: app.get('/next', function
我是一名优秀的程序员,十分优秀!