2017-02-14 4 views
0

Я использовал события в nodejs для реализации моей логики. И «nextParams» - это событие, которое снова выполняет функцию «extractVideo». Я знаю, что я использовал рекурсивный цикл событий. Я попытался использовать setTimeout (function, 0) и setTimeout (function, 1) в моем коде, но ошибка «Максимальный размер стека вызовов превышена» все еще появляется, мне интересно, кто-нибудь знает, как исправить эту проблему, меня очень ценят !Максимальный размер стека вызовов превышен в nodejs

videoCrawler.prototype.extractVideo=function(queryStr){ 
     self.on("videoIdArray",function(){ 
      if(videoIdArray.length){ 
       self.getVideoInfo(videoIdArray.pop()); 
      }else{ 
       self.videomonitor.emit("nextParams"); 
      } 
     }); 

     self.on("getVideoIdArray",function(videoidarray){ 
      if(!(videoidarray || videoidarray.length)){ 
       self.videomonitor.emit("nextParams"); 
      } 
       videoIdArray=videoidarray; 
       self.getVideoInfo(videoIdArray.pop()); 
     }); 

     self.on("save",function(videodetailinfo){ 
      if(!videodetailinfo){ 
       if(videoIdArray.length){ 
        self.getVideoInfo(videoIdArray.pop()); 
       }else{ 
        self.videomonitor.emit("nextParams"); 
       } 
      } 
      self.saveVideoInfo(videodetailinfo); 
     }); 
     self.on("errorCapture",function(errInfo){    
      if(errInfo.message=="queryStr is not exits"){ 
       setTimeout(self.videomonitor.emit("nextParams"),1); 
      }else if(errInfo.message=="videodetailsinfo is not exits"){ 
       self.getVideoInfo(videoIdArray.pop()); 
      }else if(errInfo.message=="videoId is empty"){ 
       self.getVideoInfo(videoIdArray.pop()); 
      }else if(errInfo.message=="save fails"){ 
       self.getVideoInfo(videoIdArray.pop()); 
      } 
     }); 
     self.getVideoId(queryStr); 
    } 

ниже функции

videoCrawler.prototype.getVideoId=function(queryStr){ 
     if(!queryStr) this.emit("errorCapture",errInfo); 
     //dosomething 
     this.emit("getVideoIdArray",videoArray); 
    } 

     videoCrawler.prototype.getVideoInfo=function(videoId){ 
     if(!queryStr) this.emit("errorCapture",errInfo); 
     //dosomething 
     self.emit("save",videodetails); 
     } 

     videoCrawler.prototype.saveVideoInfo=function(videodetailsinfo){ 
     if(!queryStr) this.emit("errorCapture",errInfo); 
     //dosomething 
     self.emit("videoIdArray"); 
     } 

ответ

0

Для некоторых проблем, которые связаны tail calls, вы можете включить оптимизацию хвостового вызова в некоторых версиях Node. Смотрите это для совместимости:

Для получения информации о соответствующих вызовах хвостовых см:

Для других случаев, когда вы не имеете хвосты вы должны использовать setImmediate() или process.nextTick() в зависимости от того, когда вы хотите лет ur, вместо того, чтобы использовать setTimeout(), потому что они оптимизированы, но setTimeout() по-прежнему избегают роста стека вызовов. Но здесь вы не используете setTimeout() для каждого вызова, и это, вероятно, проблема.

Смежные вопросы