0

我有一个包含一堆 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帮助我做到这一点,但到目前为止我一直无法正确编写代码。

4

0 回答 0