【发布时间】:2014-03-21 03:46:31
【问题描述】:
我对 nodeJS/Javascript 的异步特性(Python 背景)比较陌生,并试图弄清楚如何逐步遍历嵌套的 JSON 对象,使用 asnyc.js 提取它的值。
我遇到了这个sn-p,How to navigate in nested JSON。
function recursiveGetProperty(obj, lookup, callback) {
for (property in obj) {
if (property == lookup) {
callback(obj[property]);
} else if (obj[property] instanceof Object) {
recursiveGetProperty(obj[property], lookup, callback);
}
}
}
这对这个示例对象 foo 非常有效。
var foo = {
'key_1' : 'val1',
'key_2': {
'key_3': 'val3',
'key_4': 'val4'
}
}
recursiveGetProperty(foo, 'key_1', function(obj) {
console.log(obj);
});
返回“val1”
recursiveGetProperty(foo, 'key_3', function(obj) {
console.log(obj);
});
返回“val3”
这正是我所需要的,但是当我通过迭代为其提供键值时:
var keys = ['val1', 'val3'];
for (var keys in keys) {
recursiveGetProperty(foo, keys, function(obj) {
console.log(obj);
});
}
没有任何内容记录到控制台。所以我写了一个日志功能:
function log(obj) {
console.log(obj);
}
并尝试过:
for (var key in keys) {
recursiveGetProperty(foo, keys, log(obj));
}
但我得到 ReferenceError: obj is not defined。
有人告诉我,在 for 循环中执行回调不是一个好主意,我不确定为什么,所以我研究了 async.js。这似乎是我想要的正确解决方案,但我不知道如何去做。
使用 async.js,我想构建一系列 recursiveGetProperty 函数,将它们存储在一个数组中,然后异步执行这些调用,但我不知道如何解决这个问题。
我最终想要的是这样的:
async.each(['key_1', 'key_2', 'key_3'], recursiveGet(key) {
doSomethingWithData();
}, function(err) {
doSomethingWhenDone();
});
这将在 ExpressJS 服务器上用于解析 JSON 并在之后对其进行处理。
任何帮助或建议将不胜感激。
【问题讨论】:
-
recursiveGetProperty(foo, keys, log(obj));应该是recursiveGetProperty(foo, keys, log);什么是 foo?为什么要在简单数组上使用递归 get 属性方法?它不是为此而设计的。 -
foo 只是我想要解析的嵌套 JSON 示例。我想为 recursiveGet 函数提供一个键列表。
标签: javascript node.js express async.js