Максимальный размер стека вызовов превышен в nodejs

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

    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");
      }

Ответ 1

Для некоторых проблем, связанных с оконечными вызовами, вы можете включить оптимизацию оконечных вызовов в некоторых версиях Node (начиная с 6.5, но не более с 8.0!).

Смотрите это для совместимости:

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

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