“process.nextTick”如何防止我的堆栈爆炸
How does `process.nextTick` keep my stack from blowing up?
我偶然发现了一个函数(在SO上),它可以写入文件,但确保不会覆盖文件:
function writeFile(i){
var i = i || 0;
var fileName = 'a_' + i + '.jpg';
fs.exists(fileName, function (exists) {
if(exists){
writeFile(++i);
} else {
fs.writeFile(fileName);
}
});
}
下面有一条有趣的评论:
小调整:由于JavaScript不会优化尾部递归,所以将
writefile(++i)
更改为process.nextTick(function(i) {writefile(++i);});
,这样可以防止在必须遍历大量文件名时堆栈爆炸。
请解释。process.nextTick
如何防止烟囱爆炸?
更新:原来评论中的假设是错误的!无论如何,确实存在process.nextTick
在防止堆栈溢出方面发挥作用的情况(请参阅公认答案中的示例)。
如果您有一个同步调用自己的函数,比如说,200k次,那么由于堆栈嵌套太深,代码将错误退出。process.nextTick
通过在每次迭代中清除调用堆栈来避免类似于setTimeout(fn,0)
的情况。它只是将传递函数的执行推迟到下一次事件循环运行时。
更多阅读(但已过期):http://howtonode.org/understanding-process-next-tick
落入此陷阱的示例函数:
(function doWork (i) {
if (i === 0) return;
console.log('Doing work!');
doWork(--i);
}(2000000))
和process.nextTick:修复的相同功能
(function doWork (i) {
if (i === 0) return;
console.log('Doing work!');
process.nextTick(function () {
doWork(--i);
});
}(2000000))
然而,在您的情况下,这不会是一个问题,因为由于fs.exists(
,代码是异步的,因此您引用的注释是不正确的。
相关文章:
- 为什么不't Javascript对我的输入值进行了一些重新检查
- 可以't让我的if语句处理js中的html表单输入
- 我的单元测试选项是什么
- 将输入字段中的文本提交到我的数据库,同时将其添加到我的列表中
- 我的职位回报太快了,如何做出承诺
- 我的jQuery插件参数没有正确启动,遇到了问题
- 如何识别我的网站中的慢速设备
- 如何将JSON数据导入我的ejs模板
- 为什么我的JavaScript堆栈排序函数不起作用
- 在我的平均堆栈应用程序中使用承诺
- “process.nextTick”如何防止我的堆栈爆炸
- 我刚刚开始使用 MEAN 堆栈.我试图将我的表单提交数据存储到 mongo 数据库,但我无法这样做
- 为什么删除条形,然后将条形重新添加到我的堆栈条形图中会更改条形的位置
- 为什么我的jQuery函数在IE 8中导致“堆栈溢出”错误
- 服务堆栈是我的数据中的双转义引号
- 在我的 ReactJS 代码中超出了最大调用堆栈大小
- 是node.js + express(后端)+ emberjs(客户端)一个合理的堆栈为我的项目
- 在我的.click回调中触发click事件会导致“超过最大调用堆栈大小”
- 简单的AngularJS或我的网络应用程序的MEAN堆栈
- 如何使用 MEAN 堆栈将上传的图像存储到我的其他域