我有一个文件夹,其中包含一堆看起来像这样的JSON文件:
|
|-foo.json
|-bar.json
|-qux.json
|-baz.json
|-zot.json
每个JSON文件都有一个属性children
,该属性指向其他一些JSON文件,因此它们都描述了一棵树。现在,说这是foo.json:
foo.json
{
"id": "foo",
...
"children": [
"bar.json",
"baz.json"
]
...
}
假设bar.json没有children
属性,而这是baz.json:
baz.json
{
"id": "baz",
...
"children": [
"zot.json"
]
...
}
我正在尝试编写一个Node程序,该程序将列出给定JSON文件的后代。意味着对于foo.json
,它应该输出[bar, baz, zot]
。
我正在使用fs-extra来读取JSON文件。
如果我同步执行此操作,则将编写如下内容:
const fs = require('fs-extra');
var descendants = ["foo.json"];
for(var k = 0; k < descendants.length; k++){
var obj = fs.readJsonSync(descendants[k]);
if(obj.children) descendants.concat(obj.children);
}
return descendants;
注意: 为简单起见,假设脚本在json文件所在的目录的根目录上执行
但是我想使用promise来做到这一点。我的问题是,我似乎无法解析每个文件的承诺并将结果在循环结束之前添加到descendants
变量中,这当然是因为循环是同步的。
使用诺言做到这一点的正确方法是什么?特别是,我一直在尝试使用Q.js和reduce
的组合来帮助我完成此操作,但是到目前为止,我仍然无法正确编写代码。