#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 ОК, значит, корневой узел не должен быть затронут этим, потому что у него нет родительского узла? Тогда эта часть в порядке.