- 兑现承诺时,尽量做到纯正。避免使用具有副作用的函数,即不要在其自身作用域之外操作任何变量。
- 避免将回调传递给函数。仅将它们传递给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 )); });


