栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Node.js-超出最大调用堆栈大小

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Node.js-超出最大调用堆栈大小

您应该将递归函数调用包装到

  • setTimeout
  • setImmediate
    要么
  • process.nextTick

函数使node.js有机会清除堆栈。如果您不这样做,并且有很多循环没有任何 真正的
异步函数调用,或者如果您不等待回调,那么您

RangeError: Maximum call stack size exceeded
不可避免

有很多有关“潜在异步循环”的文章。这是一个。

现在再看一些示例代码:

// ANTI-PATTERN// THIS WILL CRASHvar condition = false, // potential means "maybe never"    max = 1000000;function potAsyncLoop( i, resume ) {    if( i < max ) {        if( condition ) {  someAsyncFunc( function( err, result ) {      potAsyncLoop( i+1, callback ); });        } else { // this will crash after some rounds with // "stack exceed", because control is never given back // to the browser  // -> no GC and browser "dead" ... "VERY BAD" potAsyncLoop( i+1, resume );         }    } else {        resume();    }}potAsyncLoop( 0, function() {    // pre after the loop    ...});

这是对的:

var condition = false, // potential means "maybe never"    max = 1000000;function potAsyncLoop( i, resume ) {    if( i < max ) {        if( condition ) {  someAsyncFunc( function( err, result ) {      potAsyncLoop( i+1, callback ); });        } else { // Now the browser gets the chance to clear the stack // after every round by getting the control back. // Afterwards the loop continues setTimeout( function() {     potAsyncLoop( i+1, resume );  }, 0 );        }    } else {        resume();    }}potAsyncLoop( 0, function() {    // pre after the loop    ...});

现在您的循环可能变得太慢,因为我们每回合会浪费一点时间(一次浏览器往返)。但是您不必

setTimeout
每次都跟注。通常,每千次可以这样做。但这可能会有所不同,具体取决于您的堆栈大小:

var condition = false, // potential means "maybe never"    max = 1000000;function potAsyncLoop( i, resume ) {    if( i < max ) {        if( condition ) {  someAsyncFunc( function( err, result ) {      potAsyncLoop( i+1, callback ); });        } else { if( i % 1000 === 0 ) {     setTimeout( function() {         potAsyncLoop( i+1, resume );      }, 0 ); } else {     potAsyncLoop( i+1, resume );  }        }    } else {        resume();    }}potAsyncLoop( 0, function() {    // pre after the loop    ...});


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/427033.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号