如何返回嵌套承诺

时间:2018-01-03 18:38:29

标签: javascript promise

我正在尝试从result函数返回getColumn参数。记录时,它返回undefined。

连接函数连接到SQL DB,查询返回数据集。

如何将变量传递回承诺链?

getColumn = function(columnName, table) {
  sql.connect(config.properties)
    .then(result => {
      let request = new sql.Request();
      request.query("SELECT " + columnName + " FROM " + table)
      .then(result => {
          // want to return this result from the getColumn function
          return result
      }).catch(err => {
          // Query error checks
      })
    }).catch(err => {
      // Connection error checks
    })
} // 

console.log(getColumn('username', 'Login'))

1 个答案:

答案 0 :(得分:1)

首先,您无法直接从getColumn()返回值。该函数的内部是异步的,因此在AFTER getColumn()返回之前不会知道该值。您目前从undefined获得getColumn(),因为它没有返回值。您拥有的return是异步.then()处理程序,而不是getColumn()。无法从getColumn()返回最终值。它是异步的。您必须返回承诺或使用回调。由于您已经在函数内部使用了promises,因此您应该返回一个promise。

您可以从getColumn()返回承诺,并使用.then()await承诺获取该值。

要返回承诺,您需要返回内部承诺:

const getColumn = function(columnName, table) {
  // return promise
  return sql.connect(config.properties).then(result => {
    let request = new sql.Request();
    // chain this promise onto prior promise
    return request.query("SELECT " + columnName + " FROM " + table);
  });
} // 

getColumn('username', 'Login').then(val => {
   console.log(val);
}).catch(err => {
   console.log(err);
});