瀑布问题"/>
异步,瀑布问题
[我在这里尝试检索所有对象并将它们推入json
文件。由于某种原因,当一个记录应包含更多对象时,只有一个记录被推入文件。甚至在执行之前就已发送响应。您能帮我解决这个问题还是让我知道我要去哪里错了?这是我的代码:
exports.createjoson = (req, res) => {
const Responsearray = [];
async.waterfall(
[
function(waterfallCb) {
// ... first function
},
function(results, waterfallCb1) {
//second function
async.eachLimit(
results,
100,
function(singleResult, eachCallback) {
async.waterfall(
[
async function(innerWaterfallCb) {
try {
NewsModel.find(
{ _id: singleResult.newsId }, // #individual article
async (err, newsResult) => {
if (err) {
return innerWaterfallCb(
// #displaying error
"error in fetching news data"
);
}
const map = new Map();
for (const item of newsResult) {
if (!map.has(item.source)) {
map.set(item.source, true);
Response = {
newsId: item._id,
title: item.title,
comment: singleResultment
};
}
}
resPond = await Response;
Responsearray.push(resPond);
let data = JSON.stringify(Responsearray);
await fs.writeFileSync("abc.json", data);
}
);
} catch (error) {
innerWaterfallCb(error);
}
}
],
function(err) {
if (err) {
return eachCallback(err);
}
eachCallback(null);
}
);
},
function(err) {
if (err) {
return waterfallCb1(err);
}
waterfallCb1(null);
}
);
}
],
function(err) {
if (err) {
return res.status(200).json({ status: "400", message: err });
}
res.status(200).json({ status: "200", message: "success" });
}
);
};
回答如下:代码有很多问题:
fs.writeFileSync
将覆盖文件,而不是追加文件,因此只有您最后写入的数据将位于abc.json
中。而且它不会返回Promise
,因此不需要在其上使用await
。它是同步运行的,因此在完成之前不会返回(这就是函数名中的Sync
的含义)。要附加而不是覆盖文件,可以将标志选项设置为“ a”以附加(默认为“ w”)。似乎没有在任何地方返回
innerWaterfallCb(null)
的调用-仅在错误情况下。内部瀑布函数不应标记为async
,因为它实际上不需要执行任何await
调用。但是写入文件后应调用return innerWaterfallCb(null)
。- [[最好只收集
responseArray
中的数据,然后在外部瀑布的末尾写入一次文件,而不是在内部瀑布内部的深处重复写入。 - 变量应以小写字母开头(例如
responseArray
而不是ResponseArray
,因为大写的首字母通常表示类或模块。 - 请勿将
async/await
与异步模块(瀑布和eachLimit)混合使用。如果您使用正确的Promises和async/await
,则无需使用异步模块。完全删除waterfall
的使用并重写为正确使用Promise
对象会更清洁。
更多推荐
异步,瀑布问题
发布评论