Я хочу извлечь все дочерние папки и дочерние документы, запрашивая службу node-js, которая при каждом вызове возвращает массив таких элементов.Я не знаю глубины дерева папок, поэтому хочу рекурсивно вызвать функцию, которая в конце вернет массив, который будет содержать все дочерние папки и дочерние документы, начиная со списка корневых папок.Каждая папка идентифицируется идентификатором папки.
Так что я сделал «recPromise (fId)», который возвращает обещание.Внутри эта функция рекурсивно вызывает recFun (folderId). Я начинаю вызывать recPromise (fId) из rootFolder, поэтому после разрешения всех обещаний root я могу продолжать.
rootFolders.map( folderOfRootlevel =>{
var folderContentPromise = recPromise(folderOfRootlevel.id);
folderContentPromises.push(folderContentPromise);
})
$q.all(folderContentPromises)
.then(function(folderContent) {
// Do stuff with results.
}
function recPromise(fId){
return new Promise((resolve, reject) => {
var items = [];
function recFun( folderId) { // asynchronous recursive function
function handleFolderContent( asyncResult) { // process async result and decide what to do
items.push(asyncResult);
//Now I am in a leaf-node, no child-Folders exist so I return
if (asyncResult.data.childFolders.length === 0){
return items;
}
else {
//child_folders exist. So call again recFun() for every child-Folder
for(var item of asyncResult.data.childFolders) {
return recFun(item._id);
}
}
}
// This is the service that returns the array of child-Folders and child-Docs
return NodeJSService.ListFolders(folderId).then(handleFolderContent);
}
resolve(recFun(fId));
})
}
It works almost as expected except the loop inside else, where I call again recFun().
The NodeJSService will return an array of sub-Folders so I wish to call recfun() for every sub-Folder.
Now, I only get the result of the 1st sub-Folder of the loop,
which makes sense since I have a return statement there.
If I remove the return statement and call like this "recFun(item._id);"
then it breaks the $q.all().