javascript – 我应该使用process.nextTick还是setImmediate进行异步迭代?

前端之家收集整理的这篇文章主要介绍了javascript – 我应该使用process.nextTick还是setImmediate进行异步迭代?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在开发 a JavaScript library,其中提供了可以异步迭代的序列上的map / reduce功能.

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进行比较.

猜你在找的JavaScript相关文章