访问.then()承诺返回的值

时间:2019-07-31 18:26:45

标签: javascript promise

我是新来的诺言。抱歉,我确实曾经在这里问过类似的问题,但是我仍然不清楚如何使它起作用。我正在尝试访问我的.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> }消息。

3 个答案:

答案 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);
 })