我编写了以下代码:
var Client = require('ssh2').Client;
var info={
errors:'',
stdout:'',
stderr:''
};
conn=new Client();
conn.on('ready',()=>{
console.log('entering...');
conn.exec('ls',(err,stream)=>{
if(err) info.errors=err;
stream.on('close',(code,signal)=>{
console.log('leaving: code:'+code+' signal:'+signal);
});
stream.on('data',(data)=>{
info.stdout=data;
}).stderr.on('data',(data)=>{
info.stderr=data;
});
});
}).connect({
host: ip,
port: 22,
username: u,
password: p
});
//this gets printed earlier
console.log(info);
因此,在上面的代码中,连接到服务器并执行命令,并用已执行命令的输出更新对象info
,因此在我运行此代码后,它也会输入并执行该代码,期望它会console.log info
具有更新的值,但我首先得到的是未更新的info
,然后执行上述代码。谁能帮助我了解为什么会这样以及如何解决此问题?
尽管console.log(info);
位于程序的底部,但是它将在其他async方法执行之前被执行,因此,info
对象不会被更新。
conn.on('ready',()=>{...
stream.on('data',(data)=>{...
是所有异步功能,这些功能将在事件队列中排队,在解决它们并释放队列后将对其进行处理。
您可以选择在每个异步方法的回叫中使用console.log(info)
。
conn.on('ready',()=>{
console.log('entering...');
conn.exec('ls',(err,stream)=>{
if(err) {
info.errors=err;
console.log(info);
}
stream.on('close',(code,signal)=>{
console.log('leaving: code:'+code+' signal:'+signal);
});
stream.on('data',(data)=>{
info.stdout=data;
console.log(info);
}).stderr.on('data',(data)=>{
info.stderr=data;
console.log(info);
});
});
}).connect({
host: ip,
port: 22,
username: u,
password: p
});
这样,无论您何时接收数据或发生错误,您的info
对象都会收到正确的消息,然后可以将其记录到控制台。