异步,瀑布问题

编程入门 行业动态 更新时间:2024-10-08 22:13:56

异步,<a href=https://www.elefans.com/category/jswz/34/1762263.html style=瀑布问题"/>

异步,瀑布问题

[我在这里尝试检索所有对象并将它们推入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" });
    }
  );
};
回答如下:

代码有很多问题:

  1. fs.writeFileSync将覆盖文件,而不是追加文件,因此只有您最后写入的数据将位于abc.json中。而且它不会返回Promise,因此不需要在其上使用await。它是同步运行的,因此在完成之前不会返回(这就是函数名中的Sync的含义)。要附加而不是覆盖文件,可以将标志选项设置为“ a”以附加(默认为“ w”)。

  2. 似乎没有在任何地方返回innerWaterfallCb(null)的调用-仅在错误情况下。内部瀑布函数不应标记为async,因为它实际上不需要执行任何await调用。但是写入文件后应调用return innerWaterfallCb(null)

  3. [[最好只收集responseArray中的数据,然后在外部瀑布的末尾写入一次文件,而不是在内部瀑布内部的深处重复写入。
  4. 变量应以小写字母开头(例如responseArray而不是ResponseArray,因为大写的首字母通常表示类或模块。
  5. 请勿将async/await与异步模块(瀑布和eachLimit)混合使用。如果您使用正确的Promises和async/await,则无需使用异步模块。完全删除waterfall的使用并重写为正确使用Promise对象会更清洁。

更多推荐

异步,瀑布问题

本文发布于:2024-05-07 21:03:57,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1757248.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:瀑布

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!