承诺不等待FTP流上的解析

时间:2018-07-23 15:52:28

标签: promise chaining

我有许多服务器可查询其中存在的日志文件信息。 为此,我建立了一个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   
    })
}

拒绝已被省略,但已被考虑并且在执行时不会被调用。代码正常执行,但是某些服务器在控制台返回一些空对象。记录处理过的数据确实显示了该信息。

我很茫然,当然会很乐意伸出援手。

0 个答案:

没有答案
相关问题