Я пытаюсь построить древовидную структуру, пройдя заданный идентификатор и прикрепив его дочерний элемент к дереву. Он всегда назначает user.children = 'образец' вместо извлеченных дочерних элементов пользователя из user.children = usrChild, также пробовал usrArr[index].children = 'образец'
Что я пытаюсь реализовать: используя идентификатор пользователя, я буду получать его дочерние элементы, теперь для каждого дочернего элемента я буду получать их дочерние элементы, пока не останется детей.
Функция UserProfile.getUserChildren возвращает обещание с данными, состоящими из всех дочерних элементов. Теперь мы повторяем каждого дочернего элемента и получаем их дочерние элементы.
Ожидаемый результат визуально:
Программно Что я ожидаю:
[
{
text: {
userID: 1
name: 'Mike'
},
children:[
{
text: {
userID: 2
name: 'John'
},
children [
{
text: {
userID: 4
name: 'Hero'
},
children []
}
]
},
{
text: {
userID: 3
name: 'Kelvin'
},
children []
}
]
}
]
Код в узле JS:
let UserProfile = require('./UserProfile');
// Love Dad 83273010
let userID = 51405009;
var allDistributors = Array();
rootUser = new Object();
rootUser.text = {userID:userID,name:'Root'};
rootUser.children = [];
function getUserTree(userID){
return new Promise( (resolve,reject) => {
/*
* UserDownline Return User child Array
* Format:
* [
* { text: {
* userID: 45
* name: 'Mike'
* },
* children:[]
* }
* ]
*
*/
UserProfile.getUserChildren(userID).then(async (data) => {
if (data.length > 0){
rootUser.children = data;
/*
* Iterating each user to fetch and assign its child
*/
await rootUser.children.forEach(async (user,index,usrArr) => {
user.children = 'sample'
await getUserTree(user.text.title).then( async(usrChild) => {
/*
Assigning child to root user
*/
usrArr[index].children = usrChild; // STILL NOT ABLE TO ASSIGN VALUE and return user.children as 'sample'
}).then(resolve(rootUser));
});
//resolve(rootUser)
//console.info(rootUser)
//return Promise.all(rootUser);
}else
resolve([]); // return empty child when no child exist
});
//return rootUser.children;
//console.info(rootUser);
});
}
//console.info(JSON.stringify(rootUser));
getUserTree(userID).then((data) => {
console.info(JSON.stringify(data));
});
Любая идея, как я могу добиться этого или каким-либо другим способом выполнить итерацию, чтобы присваивание выполнялось после завершения getUserTree ?
Array.map с обещанием.все



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Как указал Джароманда X, rootUser.children.foreach возвращает undefined вместо обещания. Попробуйте вместо этого использовать rootUser.children.map. Это возвращает массив промисов, которые вы можете ожидать при использовании Promise.all, который возвращает обещание массива. Поскольку карта не изменяет исходный массив, вам нужно будет присвоить rootUser.children ожидаемому результату Promise.all
Все та же проблема, что и foreach
Ожидаемый результат вашего примера не показывает свойство user.text.title. Это приводит к тому, что идентификатор, переданный функции getUserTree, не определен. Вам также нужно будет вернуть результат getUserTree на карту
await xxx.forEach(async- это не делает то, что вы думаете... так какforEachвозвращает (сразу)undefined, ничего внутри обратного вызова forEach неawaitвключено