javascript回调和匿名函数的范围是什么?
我使用 node.js 和 riak-js 编写了以下代码。我有一个递归函数 walk
,它应该是 JSON 文档列表,但却返回一个空列表...为什么?如何修复?
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', []);
提前致谢!
I have written the following code using node.js and riak-js. I have a recursive function walk
that should be a list of JSON documents, but instead returns an empty list... why? how to fix?
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', []);
Thanks in advance!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您会得到一个空数组,因为 db.get() 是异步的。它立即返回,无需等待回调被调用。因此,当解释器到达
return list
语句时,list
仍然是一个空数组。Node.js(甚至浏览器脚本)中的一个基本概念是一切都是异步的(非阻塞)。
You get an empty array because
db.get()
is asynchronous. It returns immediately without waiting for the callback to be invoked. Therefore when the interpretor reaches thereturn list
statement,list
is still an empty array.It is a fundamental concept in Node.js (and even in browser scripting) that everything is asynchronous (non-blocking).