如何在Node.js中使用Promises遍历文件

时间:2018-12-04 14:43:06

标签: node.js promise es6-promise q fs-extra

我有一个文件夹,其中包含一堆看起来像这样的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.jsreduce的组合来帮助我完成此操作,但是到目前为止,我仍然无法正确编写代码。

0 个答案:

没有答案