gpt4 book ai didi

node.js - Node 中嵌套 readFiles 的 Promise 模式

转载 作者:太空宇宙 更新时间:2023-11-04 00:06:58 25 4
gpt4 key购买 nike

我是 Node 和 promise 的新手,我很困惑。

我正在读取一个 json,其中包含有关我需要读取的其他 json 文件的信息。它看起来像这样:

{ 
id: 1,
name: "My name",
includes: [
"#include1.json",
"#include2.json",
"#include3.json"
]
}

包含文件如下所示:

{
id: 1,
name: "Include 1",
details: "I am include 1"
}

我需要做的是读取主json,然后使用所有给定的包含构建一个完整的json文档,所以它看起来像这样:

{ 
id: 1,
name: "My name",
includes: [
{
id: 1,
name: "Include 1",
details: "I am include 1"
},
{
id: 2,
name: "Include 2",
details: "I am include 2"
},
{
id: 3,
name: "Include 3",
details: "I am include 3"
},
]
}

主 json 文件将指示包含哪些内容。

我将 readFile 方法放入一个返回 Promise 的函数中

function readFile(filename, enc, err){
return new Promise(function (fulfill, reject){
if(err) reject(err);
fs.readFile(filename, enc, function (err, res){
if (err) reject(err);
else fulfill(res);
});
});
}

我的服务文件使用它

serviceReturnJsonPromise = function() {
return readFile(masterPath, 'utf8', err).then(function (masterData){
return JSON.parse(masterData);
});
}

返回主json OK

但现在我坚持包含在内

serviceReturnJsonPromise = function() {
return readFile(masterPath, 'utf8', err).then(function (masterData){
var master = JSON.parse(masterData);
var includes = [];

_.each(master.includes, function(include) {

var includePath = "./" + item.replace("#","");

return readFile(includePath, 'utf8', err).then(function (includeData){
includes.push(JSON.parse(includeData));
});
});
});
}

你可以看到它还没有完成,但这一点不起作用,因为 promise 没有堆积起来。我知道如何使用所有内容来堆叠 promise ,但在阅读主文档之前我不知道其中包含哪些内容。

如果你们能给我任何学习 Node 和 promise 的良好起点,我将不胜感激。

最佳答案

当您尝试读取包含内容并且不等待结果时,您就犯了错误。在读取第一个包含文件之前, promise 会以零数据得到解决。

这应该有效:

serviceReturnJsonPromise = function () {
return readFile(masterPath, 'utf8', err)
.then(function (masterData) {
var master = JSON.parse(masterData);

// map over includes array and return "read" promises
var includes = master.includes.map(function (item) {
var includePath = "./" + item.replace("#", "");

return readFile(includePath, 'utf8', err).then(function (includeData) {
return JSON.parse(includeData)
});
});

// wait for all file reads
return Promise.all(includes).then(jsons=>{
master.includes = jsons;
return master;
})
});
}

有一个不错的youtube video并解释了 promise 。

附注也查看 channel ,有很多解释良好的 js 主题。

关于node.js - Node 中嵌套 readFiles 的 Promise 模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51824353/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com