Я работаю над сценарием nodejs, в котором я получаю данные из внешнего источника и которые необходимо преобразовать во вложенный объект глубокого уровня, определенный в файле json.
Основная функция (getMainData ) получает список словарей, запускает для l oop в этом списке для дальнейшего вызова рекурсивной функции processTopObj с одним элементом словаря за раз. processTopObj - это рекурсивная функция, которая вызывает себя, когда определенное условие истинно, в противном случае она возвращает обещание для каждой вызываемой итерации. Перед рекурсивным вызовом он возвращает Promise.resolve (который, я считаю, не является окончательным обещанием, поскольку есть дополнительные дочерние элементы, которые нужно обработать. , выполняется асинхронно, и я не могу знать, когда все вызовы processTopObj завершены, поскольку мне нужно вернуть окончательный результат из основной функции после того, как все рекурсивные вызовы в ней будут выполнены. Пожалуйста, предложите, как go об этом проблема.
Основная функция: getMainData (topObj) {
return new Promise(function (resolve, reject) {
// topObjectList is an array of dictionaries.
getdatafromsource.then(function (topObjectList) {
//loop through each dictionary
for (const topObjElement of topObjectList) {
//call recursive function on the dictionary
processTopObj(topObjElement, topObj)
}
})
})
}
Рекурсивная функция processTopObj (topObjElement, topObj) {
return new Promise(function (resolve, reject) {
//get each child name and get data for that child
for (const cElement of topObj.children) {
_this.getChildData(topObjElement.dn, cElement.name).then(function (aciObjData) {
for (const pElement of aciObjData) {
//pElement is a child element
updateResponseObject(topObjElement.dn, pElement, cElement.regexp, cElement.name, cElement.allParents, cElement.directChildren).then(async function () {
Promise.resolve()
//Check if the first level child element further has children. If yes, process them in recursive fashion
if ('children' in cElement) {
processTopObj(pElement, cElement)
}
})
}
}).then(function () {
resolve(_this.respObject)
})
}
})
}