Async / Await не работает в рекурсивной функции

#node.js #recursion #promise

#node.js #рекурсия #обещание

Вопрос:

Я борюсь с проблемой «Promise».

У меня есть этот код:

 let createCategoryRoot = await categoryService.createCategory(rootCategory.title);
let setExternalIdRoot = await categoryService.setExternalId(createCategoryRoot.body.version, createCategoryRoot.body.id, rootCategory.categoryid);        
await createTree(rootCategory, setExternalIdRoot);
return true;
  

Это функция createTree (рекурсивная):

 async function createTree(rootCategory, setExternalIdRoot) {
  try {
    if(rootCategory.children !== undefined amp;amp; rootCategory.children.category !== undefined){
      if (rootCategory.children.category.length > 0) {
        for (var i = 0; i < rootCategory.children.category.length; i  ) {
          let child = rootCategory.children.category[i];
          let createCategory = await categoryService.createCategory(child.title);
          let setExternalId = await categoryService.setExternalId(createCategory.body.version, createCategory.body.id, child.categoryid);
          let changeParent = await categoryService.changeParent(setExternalId.body.version, setExternalId.body.id, setExternalIdRoot.body.id)
          await createTree(child, changeParent.body.id);
        }
      }
    }
  } catch (e) {
    console.log(e);
  } 
}
  

Как вы можете понять, мне нужно выполнить 3 операции над каждым child элементом (создать категорию элемента, установить внешний атрибут id и родительский элемент), а затем, только когда child категория создана, рекурсивно вызвать функцию createTree также для ее дочерних элементов, передавая ее идентификатор.
Проблема в том, что я не могу сделать это асинхронно. Иногда дочерние элементы создаются до того, как родительский элемент готов, поэтому я получаю сообщение об ошибке.
Можете ли вы, пожалуйста, помочь мне понять, что я делаю неправильно?

ps. да, все функции являются async function обещаниями.

Комментарии:

1. у вас есть возврат внутри цикла for — цикл for никогда не будет выполняться более одного раза

2. хорошо, я удалил это, функция запущена, но создает только первый слой категорий. Он не выполняется рекурсивно на дочерних элементах.

3. что ж, по крайней мере, одна проблема решена

4. Это if (rootCategory.children.category.length > 0) бессмысленно, ваше условие цикла уже проверяет это.

5. @sharkbait ОК, значит, корневой узел не должен быть затронут этим, потому что у него нет родительского узла? Тогда эта часть в порядке.