@dillix

Как запустить коллбек после асинхронных функций?

Друзья, подскажите пожалуйста, как запустить коллбек функцию после того как полностью соберется объект root. Слышал, что нужно использовать Promises, но ума не приложу, как это сделать, когда у меня вложенные асинхронные функции. Вот кусок кода, где собирается объект root:
let regexp_title = /<title>(.*?)<\/title>/i
let regexp_chapter = /<meta chapter="(.*?)" order="([0-9]+)">/i
let root = {
  name: 'Global',
  file: null,
  children: []
};

fs.readdir(dataFolder, (err, fileNames) => {
  for (var i = 0, len = fileNames.length; i < len; i++) {
    if(path.extname(fileNames[i]) === '.html'){
      fs.readFile(dataFolder+fileNames[i], (err, data) => {
        let dataChapter = regexp_chapter.exec(data)[1];
        if(dataChapter.indexOf('\\') !== -1){
          let chapters = dataChapter.split('\\');
          let parentLeaf = null;
          for(var j=0, jlen = chapters.length; j < jlen; j++){
            if(parentLeaf === null) {
              if(!objTraverse.findFirst(root, 'children', {name:chapters[j]})) {
                root['children'].push({
                  name:chapters[j],
                  children:[],
                  file:null
                });
              }
            } else {
              if(!objTraverse.findFirst(root, 'children', {name:chapters[j]})) {
                if(objRef = objTraverse.findFirst(root, 'children', {name:parentLeaf})) {
                  objRef['children'].push({
                    name:chapters[j],
                    children:[],
                    file:null
                  });
                }
              }
            }
            parentLeaf = chapters[j];
          }
        }
      })
    }
  }
})
  • Вопрос задан
  • 245 просмотров
Решения вопроса 1
someart
@someart
Fullstack Laravel Developer
Вот это ваше называется callback hell'ом. Поэтому все таки стоить выделить время и почитать о промисах. Вот тут очень годно расписано все.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@de1m
В данном случае они не очень сильно помогут, там будут такие же вложения, может быть немого более читаемо.
Я похожее делал через async/await, но там тоже надо было дождаться выполнения предыдущей команды, обработать результат и передать дальше. Тоже что-то такое получается, посмотрите вот тут с 180 строки
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы