了解node.js中对递归函数的承诺

encoding_hero

我正在尝试使用递归调用从Redis中获取数据,并在成员返回null时停止并返回。

所以我的数据是这样添加的:

SADD parents.<name> <parent1> <parent2>
SADD parents.<parent1> <grandparent1> <grandparent2>
...

最终数据应如下所示:

[
 {
     label: <name>,
     parents: [
         { label: <parent1>,
           parents: [ {label: <grandparent1>}, {label: <grandparent2> }] },
         { label: <parent2> }
     ]
 }
]

这是我正在弄乱的代码(从不同来源将它们拼凑在一起),但是我不知道自己在做什么。不知道这段代码是否有用,我可能会偏离正轨。

var redis = require('node-redis');
var r_client = redis.createClient();
var Q = require('q');


function getFromRedis(nodeName){
        var ret = Q.defer();
        r_client.smembers('parents.' + nodeName,function(err,val){
                if (err) ret.reject(err);
                else {
                        var constructedObject={};  //this is our returned object
                        var dependents=[];
                        if (val)
                        {
                                for (var k in val){  //iterate the keys in val
                                        constructedObject.name = val[k];

                                        dependents.push(getFromRedis(val[k])
                                        .then(function(subVal){
                                                constructedObject[k]=subVal;
                                                return ret.promise;
                                        })
                                        );
                                }
                        }
                        else { return [] }

                }
                Q.all(dependents)
                .then(function(){ret.resolve(constructedObject);},ret.reject.bind(ret));

        });
                return ret;
}

getFromRedis( 'greg', function(out) {console.log('Final output: ' + JSON.stringify( out ))} );

我可以看一下示例,从理论上看它应该如何工作,但是我无法确定它如何与q实现一起工作。任何帮助将不胜感激。

贝吉
  • 兑现承诺时,尽量做到纯正。避免使用具有副作用的函数,即不要在其自身作用域之外操作任何变量。
  • 避免将回调传递给函数。仅将它们传递给Promise方法。您正在使用方法r_client.smembers()和调用getFromRedis方法进行此操作

我只能看到一个特定的错误,它将使您的脚本无法正常工作:

return [];

对回调没有任何影响。因此,ret在这种情况下永远都不会解决。ret.resolve([]); return;如果有的话,你会做的但是,有更好的解决方案可让您return再次使用

要重组脚本,有两点:

  • 使用Q.nfcall辅助函数(等)避免直接处理回调样式的API。then然后使用转换其结果-同步返回树叶或用于后代计算的承诺。
  • Q.all首先使用,然后转换其结果。不要为每个都添加处理程序dependent,而只需construct一步即可获得全部结果并构建

function getFromRedis(nodeName){
    return Q.ninvoke(r_client, "smembers", 'parents.' + nodeName).then(function(val) {
        // this is our returned object
        var constructedObject = {label: nodeName};
        if (val) {
            var dependents = val.map(function(par) {
                // get a promise for the next level
                return getFromRedis(nodeName+"."+par.toString());
            });
            return Q.all(dependents).then(function(dependentResults) {
                 constructedObject.parents = dependentResults;
                 return constructedObject;
            });
        } else { 
            return constructedObject; // without parents
        }
    });
}

getFromRedis( 'greg' ).done(function(out) {
    console.log('Final output: ' + JSON.stringify( out ));
});

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Node.js中,异步递归函数正在解析空承诺

来自分类Dev

了解承诺(使用Bluebird和Node)

来自分类Dev

不了解Node.js中的Cookie

来自分类Dev

不了解Node.js中的Cookie

来自分类Dev

更新Node js承诺函数中变量的值

来自分类Dev

了解尝试并捕获node.js

来自分类Dev

了解Node.JS async.parallel

来自分类Dev

了解尝试并捕获node.js

来自分类Dev

了解node.js回调2.0

来自分类Dev

了解JS承诺

来自分类Dev

Node js中的条件承诺

来自分类Dev

了解NASM组装中的递归阶乘函数

来自分类Dev

了解递归函数中的数组和指针

来自分类Dev

了解NASM组装中的递归阶乘函数

来自分类Dev

了解Node.js中的简单流转换

来自分类Dev

了解Node.js中的V8堆信息

来自分类Dev

了解node.js中的http.get请求

来自分类Dev

了解递归函数调用

来自分类Dev

了解递归函数

来自分类Dev

了解递归canSum函数

来自分类Dev

了解递归函数的定义

来自分类Dev

试图了解node.js中的生成器/ yield-什么执行异步函数?

来自分类Dev

在node.js示例中不了解First-class函数和csv模块事件的用法

来自分类Dev

Node.js将参数传递给express.js / passport.js中的我的require函数?了解为什么?

来自分类Dev

了解node.js pm2启动选项

来自分类Dev

使用Node.js更好地了解回调

来自分类Dev

与Node js async / await相比,了解Python async / await

来自分类Dev

node.js-了解变量引用的导出行为

来自分类Dev

了解编写 Node.js 原生插件的工具