无法使用已从promise中解析并从promise返回的值

时间:2018-02-09 20:13:56

标签: javascript mysql asynchronous promise synchronous

在下面的代码中,我获取了一个Table对象(来自mysql / xdevapi)。 getSchema()和getTable()方法返回对象,而不是promises。我的目的是让这个函数返回一个Table对象(已实现的值),我可以在其他代码中同步使用它。

// dbutils.js    
var mysqlx = require('@mysql/xdevapi');
var settings = require('./settings');

exports.getTable = (tableName) => {
  return mysqlx.getSession(settings.connectionProperties)
  .then(dbSession => {
    let table = dbSession.getSchema('shizbot').getTable(tableName);
    console.log("dbutils.getTable is returning table: " + table.getName())
    return table;
  })
  .catch(error => {
    console.log(error);
  })
}

然而,当我从这段代码调用上面的方法时,我得到TypeError试图对返回的Table对象执行一个方法,并且Table对象的值记录为{}。 (顺便说一句,我在上面的then()方法中使用了Table对象的其他代码就好了。)

// db_user.js
var dbutils = require('./dbutils');

function getUserTable() {
  let table = dbutils.getTable('user');
  console.log("table: " + JSON.stringify(table));  //  table: {}  ???
  console.log("dbuser.getUserTable is returning table: " + 
  table.getName()) // TypeError: table.getName is not a function
return table;
}

此外,我的日志显示了意外的事件顺序。到底是怎么回事?我意识到我可以(并且可能应该)利用承诺并在下游重写我的代码,但为什么这段代码不起作用?我试图更好地了解如何混合异步和同步代码。

谢谢!

Console Output:
running /authenticate route.
table: {}
Error while authenticating: TypeError: table.getName is not a function
POST /admin/authenticate 500 24.089 ms - 40
dbutils.getTable is returning table: user

2 个答案:

答案 0 :(得分:0)

我相信这是因为您的console.log语句在您的异步table.getTable('user')完成之前正在执行。

答案 1 :(得分:0)

在异步功能准备好之前执行console.log()语句。此处还需要.then()函数的Promise语句,以便您的数据现在位于我在代码中显示的表中:

// db_user.js
var dbutils = require('./dbutils');

function getUserTable() {
  dbutils.getTable('user')
    .then(function(table) {
      console.log("table: " + JSON.stringify(table));
      console.log("dbuser.getUserTable is returning table: " + table.getName());
      return table;
    })
}

请尝试我的代码并告诉我有关错误的信息