【发布时间】:2018-10-28 08:06:46
【问题描述】:
请对此有所帮助,我是 nodejs 新手,这是一个常见问题,我在这里尝试了其他帖子中的示例。我在最后一个函数中遇到了问题。
我正在尝试:
- 检查 data.json 是否存在并使用 async.waterfall 的一些数据创建它
function IfDataDontExistsCreate(callback)
{
async.waterfall([ //If data dont exists
function IfExistDataFile(callback) {
fs.exists(path, function(exists){
if(!exists)
{
try {
const firstDataFile = {"readedPosts":{"id": []}};
const json = JSON.stringify(firstDataFile, null, 2);
callback(null, json);
} catch (error) {
callback(error);
}
}
}
)},
function CreateDataFile(json ,callback) {
fs.writeFile(path, json, function (err) {
if(err) callback(err);
})
}
], function (err, callback) {
if(err) throw err;
});
callback(null, callback);
}
- 读取 data.json,获取数据,添加一些信息并使用 async.waterfall 保存 data.json
function AppendtoDataFile(info, callback)
{
async.waterfall([
function ReadGetData(callback) {
fs.readFile(path, (err, data) => {
if(err) throw err;
let datajson = JSON.parse(data.toString());
datajson.readedPosts.id.push(info.toString()); //Add info
callback(err, datajson)
})
},
function WriteDataFile(data, callback) {
const writeData = fs.writeFile(path, JSON.stringify(data, null, 2), function (err) {
if(err) throw err;
callback(err);
})
}
], function(err, callback)
{
if(err) throw err;
});
callback(null, callback);
}
- 使用 async.series 加入函数
function AddPostID(postID, callback)
{
async.series({
one: function (callback) {
IfDataDontExistsCreate(function () {
callback(null, "DataFile Created");
});
},
two: function (callback) {
AppendtoDataFile(postID, function () {
callback(null, "PostID added to Datafile");
});
}
}),
function (err, results) {
if(error) throw err;
console.log(results);
}
}
【问题讨论】:
-
这正是 promises 被发明的原因。它们为链接、嵌套或分支异步操作创建了一个更加健全的机制。与
await一起使用时效果更好。 -
阅读你的代码,你错过了多个回调,或者多次调用同一个......正如@jfriend00所说,你应该使用承诺。
-
嗯,但使用的模块与回调函数和这些东西一起工作..
-
是的,当然可以,但是既然我们现在得到了承诺,为什么不使用它们。看看我的回答,我将您的代码移植到了 Promise 中。如果您有任何疑问,请告诉我。
标签: javascript json node.js asynchronous async.js