Javascript 如何在Node.js的递归函数中传输数据?
我的目标是使用MS Graph API和Node.js从O365抓取所有消息。 首先我获取根文件夹,然后我对根文件夹进行迭代并获取消息,如果存在子文件夹,则执行childrenFoldersRequest函数。如果有更多子文件夹,此函数在递归中调用self。 所有这些都很好,但是我将结果对象存储在内存中,并将结果写入json文件。它可能会在将来导致性能问题。如何通过管道将所有递归响应传输到结果json文件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) {
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)标识。在递归函数的末尾,每个“迷你流”都将生成主流。。。如果你不能做到这一点,那就使用一些工具,专注于大数据处理?对不起,我不能再帮你了:(