2010-10-01 41 views
2

我已经使用node.js和riak-js编写了以下代码。我有一个递归函数walk,它应该是JSON文档的列表,而是返回一个空列表...为什么?怎么修?javascript回调函数和匿名函数的作用域是什么?

require('riak-js'); 

var walk = function(bucket, key, list){ 
    if(list == undefined){ 
    var list = new Array(); 
    } 
    db.get(bucket, key)(function(doc, meta){  
    list.push(doc); 
    if(meta.links.length > 0 && meta.links[0].tag == 'child'){ 
     walk(bucket, meta.links[0].key, list); 
    } 
    }); 
    return list; 
} 

familytree = walk('smith', 'walter', []); 

在此先感谢!

+3

根据指南,我认为你的语法是关闭的。它应该是'db.get(bucket,key,function(doc,meta)'... – 2010-10-01 04:43:44

+0

@Matthew Flaschen是对的。你的'db.get'的语法是错误的。 – 2010-10-01 06:09:47

+0

其实我的语法正确的版本riak-js我正在使用(v0.2.2) - 如果你看看指南,你会看到它说“注意:本指南仅适用于riak-js 0.3.0” – roder 2010-10-01 12:51:07

回答

4

因为db.get()是异步的,所以会得到一个空数组。它立即返回而不等待回调被调用。因此,当解释器达到return list声明时,list仍然是一个空数组。

这是Node.js(甚至在浏览器脚本)中的一个基本概念,即所有内容都是异步的(非阻塞的)。