Выполнение рекурсивной функции за l oop и получение конечного результата - Nodejs - PullRequest
0 голосов
/ 29 мая 2020

Я работаю над сценарием 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)
            })
        }
    })
}
...