Javascript 如何在Node.js的递归函数中传输数据?

Javascript 如何在Node.js的递归函数中传输数据?,javascript,json,node.js,recursion,Javascript,Json,Node.js,Recursion,我的目标是使用MS Graph API和Node.js从O365抓取所有消息。 首先我获取根文件夹,然后我对根文件夹进行迭代并获取消息,如果存在子文件夹,则执行childrenFoldersRequest函数。如果有更多子文件夹,此函数在递归中调用self。 所有这些都很好,但是我将结果对象存储在内存中,并将结果写入json文件。它可能会在将来导致性能问题。如何通过管道将所有递归响应传输到结果json文件 function getMessages(accessToken, callback) {

我的目标是使用MS Graph API和Node.js从O365抓取所有消息。 首先我获取根文件夹,然后我对根文件夹进行迭代并获取消息,如果存在子文件夹,则执行childrenFoldersRequest函数。如果有更多子文件夹,此函数在递归中调用self。 所有这些都很好,但是我将结果对象存储在内存中,并将结果写入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));
    });

  }
});

您可能有这种“缓存”功能方法。 在闭包上初始化流(在可访问的顶层) 然后,在每次迭代中,您将添加关于它的下一个信息

也许你可以使用highland作为你的溪流,它很棒:)


希望我能帮忙

谢谢您的回复。此外,我还需要将新数据(每次迭代时检索的对象)粘贴到第一个流数据的某些部分,而不是将数据附加到文件的末尾。我怎么能做到这一点呢?嗯,我明白了,也许可以在主流之外通过迭代创建一个流,并调用所需的特定流。为此,您必须创建一个流指向列表,其中每个流将由一个id(例如folderName)标识。在递归函数的末尾,每个“迷你流”都将生成主流。。。如果你不能做到这一点,那就使用一些工具,专注于大数据处理?对不起,我不能再帮你了:(