我是新来的诺言。抱歉,我确实曾经在这里问过类似的问题,但是我仍然不清楚如何使它起作用。我正在尝试访问我的.then()
块中的promise可能返回的值。我需要能够访问在.then()
块中运行的SQL查询的结果,以便在测试框架中进行某些数据验证。
此版本可以正常工作,并且我可以在控制台中获得SQL查询的结果。
const mysqlssh = require('mysql-ssh');
const fs = require('fs');
let conn = mysqlssh.connect(
{
host: '***',
user: '***',
privateKey: fs.readFileSync( process.env.HOME + '***')
},
{
host: '***',
user: '***',
password: '***',
database: '***'
})
const query1 = 'SELECT count(*) as cnt FROM table';
conn.then(function(client) {
client.query(query1, function (err, result) {
console.log(result[0].cnt)
})
})
在此版本中,我的控制台以未决状态记录承诺:
const mysqlssh = require('mysql-ssh');
const fs = require('fs');
let conn = mysqlssh.connect(
{
host: '***',
user: '***',
privateKey: fs.readFileSync( process.env.HOME + '***')
},
{
host: '***',
user: '***',
password: '***',
database: '***'
})
const query1 = 'SELECT count(*) as cnt FROM table';
let tableCount = conn.then(function(client) {
client.query(query1, function (err, result) {
return result[0].cnt
})
})
console.log(tableCount);
当我在then
块中执行console.log(result [0] .cnt)时-我在控制台中完全看到了结果。但是,如果我尝试将其分配给变量,然后在控制台中记录该变量,则会在控制台中收到Promise { <pending> }
消息。
答案 0 :(得分:2)
变量tableCount是对该函数的引用。您想使用tableCount()调用它。
console.log(tableCount());
或
let tableCount = conn.then(function(client) {
client.query(query1, function (err, result) {
console.log( result[0].cnt );
})
})
答案 1 :(得分:1)
您的控制台日志在第一个示例中正确显示,因为控制台日志位于then
块内。这样可确保在到达控制台日志之前,完成由conn()
执行的异步操作。
在第二个示例中,控制台日志似乎出现在代码中间,并且不能确保在控制台日志记录之前完成异步操作。这就是导致您尝试控制台日志时收到的promise待处理日志的结果。
在尝试控制台记录结果之前,您需要确保您的功能完成运行。第一种方法比较容易-您还可以在代码中添加更多的Promise链或进一步进行异步/等待以获取结果,然后在执行这些其他步骤后控制台日志。
答案 2 :(得分:0)
您正在为变量 tableCount 分配一个承诺。这就是console.log记录承诺的原因。要访问promise的已解决值,您可以尝试以下操作:
conn
.then((client) => {
const promise = new Promise((resolve, reject) => {
client.query(query1, (err, result) => {
if(err) {
reject(err);
}
resolve(result[0].cnt);
})
});
return promise;
})
.then((tableCount) => {
console.log(tableCount);
})