У меня есть следующая рекурсивная функция, которая прекрасно работает, когда вывод из transformItem является синхронным, но мне было очень трудно понять, как его реорганизовать, когда transformItem возвращает обещание и все еще получает тот же тип желаемого финала вывод объекта.
function transformStack(target, stack){
var stackItem = stack.shift();//Copy Value
util.logData(_this.context, "Target:" + JSON.stringify(target) + " Stack:" + JSON.stringify(stack), 9);
switch(stackItem){
case "[]":
for(var x=0; x < target.length; x++){
//Copies values so not by Ref any more
var nextTarget = JSON.parse(JSON.stringify(target[x]));
if(stack.length > 0){
util.logData(_this.context, "Loop[]:" + JSON.stringify(nextTarget), 8);
target[x] = transformStack(nextTarget, JSON.parse(JSON.stringify(stack)));
} else {
util.logData(_this.context, "TransformTarget[]:" + JSON.stringify(nextTarget), 8);
target[x] = transformItem(nextTarget);
}
}
break;
default:
//Copies values so not by Ref any more
var nextTarget = JSON.parse(JSON.stringify(target[stackItem]));
if(stack.length > 0){
util.logData(_this.context, "Loop:" + JSON.stringify(nextTarget), 8);
target[stackItem] = transformStack(nextTarget, JSON.parse(JSON.stringify(stack)));
} else {
util.logData(_this.context, "TransformTarget:" + JSON.stringify(nextTarget), 8);
target[stackItem] = transformItem(nextTarget);
}
}
return target;
}
Я создал этот базовый JSFiddle, который немного лучше иллюстрирует то, что я ожидаю:
https://jsfiddle.net/fxay76k8/9/
Может ли кто-нибудь помочь направить меня в правильном направлении? Я просматривал следующее сообщение о переполнении стека, но не смог правильно применить его к своему потоку:
JavaScript: вызов рекурсивных функций с обещаниями
Спасибо за вашу помощь!
Кстати, я использую Q для обещаний, но я вполне уверен, что смогу перевести любые другие библиотеки обещаний на то, что мне нужно, если кто-то может помочь мне с концепциями здесь.