【问题标题】:How to stream data in recursion function in Node.js?如何在 Node.js 的递归函数中流式传输数据?
【发布时间】:2017-05-28 17:04:46
【问题描述】:

我的目标是使用 MS Graph API 和 Node.js 抓取来自 O365 的所有消息。 首先,我获取根文件夹,然后对根文件夹进行迭代并获取消息,如果有子文件夹,则执行 childrenFoldersRequest 函数。如果有更多子文件夹,此函数将递归调用它自己。 一切都很好,但是我将结果对象存储在内存中并将此结果写入 json 文件。将来可能会导致性能问题。如何管道所有递归响应并将其流式传输到结果 json 文件?

function getMessages(accessToken, callback) {
  https.get(options, function (response) {
    var body = '';
    response.on('data', function (d) {
      body += d;
    });
    response.on('end', function () {
    var error;
    if (response.statusCode === 200) {
      var mailFolders = JSON.parse(body).value,
        resultObject = {},
        resultFolder = {};
      callback(null, JSON.parse(body));

      // Iterate through mail folders and get messages for each folder
      asyncIterator(mailFolders, function (path, next) {
        var config = {
          skip: 0
        };
        // Get messages for folder
        messageRequest(accessToken, path.id, config.skip, resultFolder, function (messages) {
          resultObject[path.displayName] = messages;
          // If folder has child folders
          if (path.childFolderCount) {
            resultObject[path.displayName].innerFolders = {};
            // Get children folders
            childrenFoldersRequest(accessToken, path.id, resultObject[path.displayName].innerFolders, function (childFolders) {
            next();
          });
        } else {
          next();
        }

      });
    }, function () {
      callback(null, resultObject);
    });
  }
});

还有 childrenFoldersRequest 函数:

function childrenFoldersRequest(accessToken, folderId, resultObject, callback) {
  https.get(options, function (response) {
    var body = '';
    response.on('data', function (d) {
      body += d;
    });

    response.on('end', function () {
      var error;
      if (response.statusCode === 200) {
        // Iterate through child folders
        asyncIterator(JSON.parse(body).value, function (path, next) {

          resultObject[path.displayName] = {};
          var resultFolder = {};
          var config = {
            skip: 0
          };
          // Get messages from folder
          messageRequest(accessToken, path.id, config.skip, resultFolder, function (messages) {

          resultObject[path.displayName].messages = messages;
          // If folder has child folders
          if (path.childFolderCount) {
            resultObject[path.displayName].innerFolders = {};
            // make recursive function call if we have child folders 
            childrenFoldersRequest(accessToken, path.id, resultObject[path.displayName].innerFolders, function (childFolders) {
            next();
          });
        } else {
          next();
        }
      });
    }, function () {
      callback(JSON.parse(body));
    });

  }
});

【问题讨论】:

    标签: javascript json node.js recursion


    【解决方案1】:

    您可能对此有“缓存”功能方法。 在闭包上初始化您的流(在顶部可访问级别) 然后,在每次迭代中,您将在其上添加下一个信息。

    也许在你的直播中使用高地,这很棒:)

    希望能帮到你

    【讨论】:

    • 感谢您的回复。此外,我需要将新数据(我在每次迭代中检索的对象)粘贴到第一个流数据的某些部分,而不是将数据附加到文件末尾。我怎样才能做到这一点?
    • 嗯,我明白了,也许除了主流之外,还可以通过迭代创建一个流,并调用所需的特定流。为此,您必须创建一个流指向列表,其中每个流将由一个 id 标识(例如,文件夹名称)。在递归函数结束时,每个“小流”都会获取主流...如果您不能这样做,请使用一些专注于大数据处理的工具...?抱歉,我帮不上忙:(
    猜你喜欢
    • 2011-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多