2013-10-24 71 views
1

如何在完成后逐个调用函数?我有这样的代码,必须连续执行。顺序执行请求

例如,我有:

var Connection = require('ssh2'); 

var c = new Connection(); 
c.on('connect', function() { 
    console.log('Connection :: connect'); 
}); 
c.on('ready', function() { 
    console.log('Connection :: ready'); 
    c.exec('uptime', function(err, stream) { 
    if (err) throw err; 
    stream.on('data', function(data, extended) { 
     console.log((extended === 'stderr' ? 'STDERR: ' : 'STDOUT: ') 
        + data); 
    }); 
    stream.on('end', function() { 
     console.log('Stream :: EOF'); 
    }); 
    stream.on('close', function() { 
     console.log('Stream :: close'); 
    }); 
    stream.on('exit', function(code, signal) { 
     console.log('Stream :: exit :: code: ' + code + ', signal: ' + signal); 
     c.end(); 
    }); 
    }); 
}); 
c.on('error', function(err) { 
    console.log('Connection :: error :: ' + err); 
}); 
c.on('end', function() { 
    console.log('Connection :: end'); 
}); 
c.on('close', function(had_error) { 
    console.log('Connection :: close'); 
}); 
c.connect({ 
    host: '192.168.100.100', 
    port: 22, 
    username: 'frylock', 
    privateKey: require('fs').readFileSync('/here/is/my/key') 
}); 

以什么方式我可以叫几个功能一个接一个?当建立到ssh2服务器的连接并执行第一个请求时,我必须分析此请求的输出并发送另一个请求,其中包含来自先前请求的数据。

我有可以做到这一切的功能;唯一的问题是如何在第一个请求完成后再发出请求。

回答

0

您可以使用嵌套回调。在每个请求的'end'处理程序中,创建一个新的连接并设置其结束处理程序。直到需要为止。类似:

c.on('end', function() { 
    // after c is done, create newC 
    var newC = new Connection(); 
    newC.on('end', function() { 
     // more if needed. 
    }); 
}); 

另一种方法是使用一些库promises,像Q,这清除了语法了很多。

您也可以看看这个问题:Understanding promises in node.js

0

从它的声音,你可能想寻找到一个控制流节点模块如async。你也不应该为了在同一台服务器上执行另一个命令而拆除连接。