Javascript 通过SSH执行exec的异步等待函数
我希望通过SSH在服务器上连续运行多个函数,一个接一个。我可以使用wait/async函数来实现这一点,但无法让这个示例工作:记录一些文本,运行正常运行时间(wait to finish),记录更多文本 我应该看到输出: 等待函数之前的Javascript 通过SSH执行exec的异步等待函数,javascript,node.js,asynchronous,async-await,promise,Javascript,Node.js,Asynchronous,Async Await,Promise,我希望通过SSH在服务器上连续运行多个函数,一个接一个。我可以使用wait/async函数来实现这一点,但无法让这个示例工作:记录一些文本,运行正常运行时间(wait to finish),记录更多文本 我应该看到输出: 等待函数之前的 STDOUT:(所有正常运行时间信息都在这里) 正常运行时间已成功完成。 等待后功能 但现在我明白了: 等待函数之前的 等待后功能 STDOUT:(所有正常运行时间信息都在这里) 正常运行时间已成功完成。 函数main函数在函数完成之前不应打印两个控制台日志
STDOUT:(所有正常运行时间信息都在这里)
正常运行时间已成功完成。
等待后功能
但现在我明白了:
等待函数之前的
等待后功能
STDOUT:(所有正常运行时间信息都在这里)
正常运行时间已成功完成。
函数main函数
在函数完成之前不应打印两个控制台日志
以下是我的示例:
const Client=require('ssh2')。客户端;
const conn=新客户端();
函数uptimeFunction(){
连接on('ready',function(){
conn.exec('uptime',函数(err,stream){
如果(错误)抛出错误;
流打开(‘关闭’)功能(代码、信号){
连接端();
如果(代码===0){
log('正常运行时间已成功完成');
}
}).on('data',函数(data){
log('STDOUT:'+数据);
}).stderr.on('data',函数(data){
log('STDERR:'+数据);
});
});
});
连接(分段);
};
函数{
返回新承诺((解决、拒绝)=>{
解析(uptimeFunction());
});
}
异步函数mainFunction(){
log('Before wait function');
等待函数();
log('After wait function');
}
main函数();
我已经研究过“ssh2承诺”,但我不理解“exec”的例子会有帮助。如果我真的需要使用ssh2promise,那么这个例子会是什么样子
我是做错了什么,还是await
没有像我在SSH上想的那样工作
谢谢 您的
等待函数
会立即解析,并且与ssh内容无关
让我们仔细看看:
返回新承诺((解决、拒绝)=>{
解析(uptimeFunction());
});
此承诺将在uptimeFunction
完成执行后立即解决。什么时候会这样?它发生在conn.on('ready',function(){
完成执行时。不幸的是,它只是一个事件绑定。它实际上不等待任何东西,从而让承诺得到解决
为了解决这个问题,您需要进一步向下传递解析函数
函数uptimeFunction(解析、拒绝){
连接on('ready',function(){
conn.exec('uptime',函数(err,stream){
如果(错误)抛出错误;
流打开(‘关闭’)功能(代码、信号){
连接端();
如果(代码===0){
log('正常运行时间已成功完成');
//成功!决心。
解决();
}否则{
//出了问题,拒绝承诺!
拒绝();
}
}).on('data',函数(data){
log('STDOUT:'+数据);
}).stderr.on('data',函数(data){
log('STDERR:'+数据);
});
});
});
连接(分段);
};
异步函数{
返回新承诺((解决、拒绝)=>{
正常运行功能(解决、拒绝);
});
}
您的等待函数
会立即解析,并且与ssh内容无关
让我们仔细看看:
返回新承诺((解决、拒绝)=>{
解析(uptimeFunction());
});
此承诺将在uptimeFunction
完成执行后立即解决。这是什么时候发生的?它发生在conn.on('ready',function(){
完成执行时。不幸的是,它只是一个事件绑定。它实际上不等待任何操作,因此允许承诺解决
为了解决这个问题,您需要进一步向下传递解析函数
函数uptimeFunction(解析、拒绝){
连接on('ready',function(){
conn.exec('uptime',函数(err,stream){
如果(错误)抛出错误;
流打开(‘关闭’)功能(代码、信号){
连接端();
如果(代码===0){
log('正常运行时间已成功完成');
//成功!决心。
解决();
}否则{
//出了问题,拒绝承诺!
拒绝();
}
}).on('data',函数(data){
log('STDOUT:'+数据);
}).stderr.on('data',函数(data){
log('STDERR:'+数据);
});
});
});
连接(分段);
};
异步函数{
返回新承诺((解决、拒绝)=>{
正常运行功能(解决、拒绝);
});
}
看起来像是在awaitFunction
中,您立即用返回值uptimeFunction
解决承诺,这不是异步的。明白了。另外,我更新了我的问题,将异步从awaitFunction
中删除,因为不需要。谢谢您的建议!看起来像是在awaitFunction
中,您立即ely只需使用返回值uptimeFunction
来解析承诺,这不是异步的。明白了。此外,我更新了我的问题,将异步从WaitFunction
中删除,因为不需要。感谢您的建议!我希望看到uptimeFunction
返回承诺。即:以开始返回新的Promise((resolve,reject)=>{…
而不是在函数之间分割模式。但是如果必须,那么至少要确认uptimeFunction
已经接受参数(resolve,reject)
,这样您就可以说返回新承诺(uptimeFunction)和等待函数
不需要声明异步
@Wyck OP的混淆在于回调和承诺如何交互。为了清晰起见,我想最小化OP和我的答案之间的差异。拒绝
也是故意的,因为它是一个错误