我有一个包含一堆 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 文件所在目录的根目录执行
但我想使用承诺来做到这一点。我的问题是我似乎无法解决每个文件的承诺并descendants
在循环结束之前将结果添加到变量中,当然因为循环是同步的。
使用 Promise 的正确方法是什么?特别是,我一直在尝试使用Q.js的组合并reduce
帮助我做到这一点,但到目前为止我一直无法正确编写代码。