JavaScript:基于递归异步/承诺的函数

时间:2018-05-01 14:56:44

标签: javascript promise q

我有以下递归函数,当transformItem的输出是同步的时,它可以很好地工作,但是当transformItem返回一个promise并且仍然获得相同类型的期望时,我一直很难弄清楚如何重构它对象输出。

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/

任何人都可以帮我指出正确的方向吗?我一直在看下面的Stack Overflow帖子,但是还没能将它正确地应用到我的流程中: JavaScript : Calling Recursive Functions With Promises

谢谢你的帮助!

顺便说一句,我正在使用Q作为承诺,但我非常有信心我可以将任何其他承诺库翻译成我需要的东西,如果有人可以帮助我理解这里的概念。

1 个答案:

答案 0 :(得分:0)

我能够使用以下重构代码:

str="karhik reddy"
n= str.length
for i in n.downto(0) do // reverse iteration of ruby 
str += str[i].to_s
end
puts str[-n..-1]

对我而言,最重要的事情是围绕如何合并对象,因为新值会递增递归。这是handleResponse的句柄。

现在我已经得到了这个答案,链接的StackOverflow是如何关联的,但是由于某种原因,我起初很难解决这个问题。