A helpful soul on GitHub建议对于Node.js,我应该使用process.nextTick来尽可能快地进行异步迭代. (该库目前在所有环境中都使用setTimeout,我明白的不是最理想的).我对Node非常缺乏经验,所以我正在阅读这个方法的工作原理,不清楚我是否是不错的选择
根据the answer to another question on SO,在这种情况下,似乎使用setImmediate可能会更有意义,因为nextTick显然跳出了等待的I / O事件,这对我来说似乎不好.
这似乎在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 calls
process.nextTick
,then the callback will fire as soon as the code runs
to completion,but before going back to the event loop.
所以我是对的,并且异步地迭代序列应该用setImmediate来完成?还是下一个在这里做个更好的选择? (在任何一种情况下,一个明确的解释为什么会非常感激)
解决方法
我会首先做严格的基准测试,使得setImmediate比process.nextTick慢.如果不是(太慢),我会立即去setImmediate,因为这不会使事件循环饿死.
在节点0.10中有一个硬限制(1000,见node.js docs)到你可以递归调用nextTick的次数,所以你应该防止这种情况发生.您需要在迭代之前选择策略,或者可以在迭代期间更改策略(同时检查当前的迭代计数).
如果您出于性能原因选择process.nextTick,则可能需要设置一个可配置的硬限制,以便多次执行process.nextTick行,否则切换到setImmediate.我没有在nodejs的严重工作负载的经验,但我认为,如果你的图书馆使他们的I / O波澜不惊,人们不会喜欢它.
setImmediate肯定是最安全的,总而言之.
至于浏览器:
我没有学过你的图书馆,但是由于您实际来自setTimeout,您可能会通过window.postMessage帮助您了解新的延迟技术,而不是.有一个很好的小型库叫做next-tick(但语义不同于节点next-tick!),而且有一个cross-browser shim for setImmediate,这是比较重的,因为1)它需要实现setImmediate规范(包括取消预定任务的能力)和2)它具有更广泛的浏览器兼容性.
查看这个async sorting demo将setImmediate(shim)与setTimeout进行比较.