Задать вопрос
@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 Оценить Комментировать
Ответ пользователя de1m К ответам на вопрос (2)
@de1m
В данном случае они не очень сильно помогут, там будут такие же вложения, может быть немого более читаемо.
Я похожее делал через async/await, но там тоже надо было дождаться выполнения предыдущей команды, обработать результат и передать дальше. Тоже что-то такое получается, посмотрите вот тут с 180 строки
Ответ написан
Комментировать