Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/443.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 通过SSH执行exec的异步等待函数_Javascript_Node.js_Asynchronous_Async Await_Promise - Fatal编程技术网

Javascript 通过SSH执行exec的异步等待函数

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函数在函数完成之前不应打印两个控制台日志

我希望通过SSH在服务器上连续运行多个函数,一个接一个。我可以使用wait/async函数来实现这一点,但无法让这个示例工作:记录一些文本,运行正常运行时间(wait to finish),记录更多文本

我应该看到输出:

等待函数之前的

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和我的答案之间的差异。
拒绝
也是故意的,因为它是一个错误