我有许多服务器可查询其中存在的日志文件信息。 为此,我建立了一个FTP连接,该连接用作动态的Promise链,允许在继续下一台服务器之前对所有数据进行流式处理。
以某种方式,当我收到数据时,似乎所有服务器都发送了正确的数据,但是某些处理的对象似乎为空。这使我相信,由于某种原因,在处理之前的数据之前会查询下一个服务器。
下面的代码在每个服务器上进行迭代,流式传输其数据并在结束连接时对其进行处理。
let data = "";
let chain = q.when();
for (var i = 0; i < servers.length; i++) {
let server = {
host: servers[i].ipaddress,
user: servers[i].user,
password: servers[i].password
}
let serverName = servers[i].name;
let accumulate = fetchData(data, server, serverName);
chain = chain.then(function() {
accumulate.then(function (result) { // <-- Connects to server & streams logfile data.
processData(result); // <-- Processes the data received
}).then(function(result) {
console.log(result); <-- Result is undefined upon resolving processData
});
});
}
下面的代码是从FTP提取流数据并解析结果,以便可以在下一个承诺中对其进行处理。
function fetchData(data, server, serverName) {
return new Promise(function (resolve, reject) {
let ftp = new Client();
ftp.connect(server);
ftp.on('ready', function () {
ftp.get(setCurrentTextFile(), function (err, stream) {
if (err) throw err;
stream.once('close', function () {ftp.end()});
stream.on('data', function (chunk) {
data += chunk
}).on('end', function () {
let result = {
"serverName" : serverName,
"data" : data
}
resolve(result) // <-- Has all data for all servers
});
});
});
});
}
function processData(result) {
return new Promise(function (resolve, reject) {
// Do stuff with log files and place in a list
console.log(list); // <-- is showing all data correctly for all servers
resolve(list); // <-- returns undefined
})
}
拒绝已被省略,但已被考虑并且在执行时不会被调用。代码正常执行,但是某些服务器在控制台返回一些空对象。记录处理过的数据确实显示了该信息。
我很茫然,当然会很乐意伸出援手。