【发布时间】:2018-03-10 15:17:07
【问题描述】:
我正在尝试以 JSON 格式读取文件,操作 JSON,然后将操作后的 JSON 返回给 flatten 函数。以下是我的承诺和我的扁平化功能。
承诺
const fs = require('fs');
module.exports = (filePath) => {
return new Promise((fulfill, reject) => {
fs.readFile(filePath, 'utf8', (err, res) => {
if (err) reject(err);
else fulfill(res);
});
});
};
扁平化函数
flatten: (baseLoc, filePath, updateRev) => {
return readFilePromise(filePath)
.then((data) => {
const jsonObject = Object.assign({}, data);
const flatJson = flattener(jsonObject, baseLoc);
if (flatJson.$meta) {
delete flatJson.$meta;
}
if (updateRev === true || updateRev === 'true') {
flatJson.id = incrementVersion(flatJson.id);
}
return flatJson;
})
.catch(err => err);
}
我在返回承诺后得到一个 {}。如果我不返回承诺,而是依赖 return flatJson 语句,我会得到未定义。我不确定为什么会发生这种情况,因为从我在 StackOverflow/Google 上看到的所有内容来看,我的一切结构都正确。
奇怪的是,如果我通过代码进行调试,我可以看到 return flatJson 语句确实保存了我正在寻找的值,只是当另一个函数调用 flatten 函数时,我最终带有未定义或 {}。
【问题讨论】:
-
无论你用多少promise-foo 包装它,你永远不会得到
flatten来返回扁平化的结果。它要么返回一个promise,要么接受一个回调,稍后调用结果。 -
你怎么称呼它?
flatten(…).then(JSON.stringify).then(send)之类的东西? -
@Bergi 我从一个单独的文件中调用它为
app.flatten(params)是否需要将 flatten 设置为承诺才能使用您提供的语法?我对承诺比较陌生,如果这些是菜鸟问题,我很抱歉 -
@KevinB 我还需要将
flatten设置为承诺吗?如何使用我想要返回的数据?我对 Promise 比较陌生,他们让我有点失望。 -
@Steve 您发布的代码应该可以做到这一点。
标签: javascript json node.js asynchronous fs