我有以下代码,它承诺了许多对各种服务器的函数调用。在所有函数调用的返回时,响应对象被发送到 Mongo 数据库并存储为单个文档。 承诺的原因是所有函数都必须完成,并且它们的返回值位于响应部分中,以便数据库可以存储所有适当的响应。(代码如下)
Q.all(functionCalls)
.then(function(response) {
//console.log(response);
Q.then(dbHandler(response))
.catch( function(e) {
console.log(e);
})
.finally( function() {
console.log('Execution completed successfully!');
});
}, function() {
console.log('unhandled exception');
});
我遇到的问题是涉及 ssh-promise 库的单个函数调用。问题是,在响应中填充 stdout 或 stderror 字段之前,承诺已解决。 这是 ssh 调用的代码。为简洁起见,截取的代码如下:
var ssh = new Client(config);
var ack = "200 - OK";
var pub = {};
var execString = "java -classpath" + classpath + javaSecurityArgs + " -DAPP_ENV=" + env + javaMainClass + jobString + " date=" + seconds;
ssh.exec( execString )
.then( function(stdout) {
json.parse(stdout.match(/^FulfillmentReportJson:(.*)$/gm))
.catch(function (e) {
console.log(e.message);
pub = {
'type': 'fulfillmentBatch',
'result': 'failed'
};
})
.then(function (response) {
console.log(stdout);
pub = {
'type': 'fulfillmentBatch',
'result': response
};
}
)
})
.catch(function(stderr) {
pub = {
'type': 'fulfillmentBatch',
'result': 'failed' + stderr
};
})
.done();
"then"的承诺实现返回来自stdout或stderror的响应,并将其填充到返回的pub.result中。
问题是这样的:当我执行此代码时,承诺在 ssh.exec 返回 stdout 或 stderror 之前完成。这就像承诺实现一样,然后将近 5 秒后(在写入数据库对象之后),我们看到 stdout/stderror 数据的返回。 数据库对象包含此函数应填充数据的位置的"null",而"then"部分中的控制台.log(stdout)包含stdout/stderror数据。 任何帮助将不胜感激。
在上面的响应后,我查看了代码,意识到我错误地接近了 ssh 命令。
ssh.exec(execString, {
exit: function(code, stdout, stderr) {
我应该在执行中使用"退出"而不是"退出"和"错误"响应。出口允许构建适当的响应对象