【问题标题】:Promise with await returning pending承诺等待返回待处理
【发布时间】:2020-12-18 18:07:58
【问题描述】:

我阅读了How do I return the response from an asynchronous call? 的答案。我仍然有点困惑为什么这段代码不能正常工作。 bool 正在返回“Promise {pending}”,它不应该返回,因为我已将 await 关键字放在那里。

db.js:

async function validateUser(username, password) {
  var sql = "SELECT * FROM users WHERE username = ? AND password = ?";
  var values = [username, password];

  let promise = new Promise((resolve, reject) => {
    con.query(sql,values, function(err, results) {
      if (err) throw err;
      if (results.length > 0){
        console.log('true');
        resolve("true");
      }
      else{
        console.log('false');
        reject("false");
      }
    }) 
  });
  let bool = await promise; // wait until the promise resolves (*)
  return bool;
}

【问题讨论】:

  • bool 绝对不是承诺。但是,async function 调用 validateUser(…) 将返回一个未来返回布尔值的承诺。相反,您需要将await 放在您实际想要使用承诺结果的调用中。
  • 不要使用throw err,而是使用reject(err)!另外,那是什么数据库库?您可能根本不需要 new Promise 包装器。

标签: javascript node.js


【解决方案1】:

您还需要await validateUser(...);否则你会得到最终会解决的承诺。

【讨论】:

    【解决方案2】:

    async 函数总是返回一个承诺。所以如果你尝试记录validateUser的返回值,它会给你一个Promise

    您从async 函数返回的任何非承诺值都隐式包装在Promise 中。

    您可以将.then() 函数链接到async 函数调用以获取解析值。

    validateUser(username, password)
      .then(value => console.log(value))
      .catch(error => console.log(error));
    

    查看您的代码,您似乎根本不需要async 函数。您可以将 validateUser 设为常规函数,然后从 validateUser 函数返回一个承诺。

    function validateUser(username, password) {
      var sql = "SELECT * FROM users WHERE username = ? AND password = ?";
      var values = [username, password];
    
      return new Promise((resolve, reject) => {
        con.query(sql,values, function(err, results) {
          if (err) reject(err);
    
          if (results.length > 0) resolve("true");
          else reject("false");
        }) 
      });
    }
    

    您还可以检查您使用的数据库库是否提供了基于Promise 的API。如果是这样,您可以只使用async-await 语法而不是使用回调版本来查询数据库并将其包装在Promise 构造函数中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-22
      • 1970-01-01
      • 1970-01-01
      • 2020-12-20
      • 1970-01-01
      • 1970-01-01
      • 2019-07-20
      相关资源
      最近更新 更多