【问题标题】:How to convert Promise to async await in node js如何在节点 js 中将 Promise 转换为异步等待
【发布时间】:2021-10-29 17:42:10
【问题描述】:

我正在尝试将带有诺言的不同代码转换为异步等待。因为我是节点新手,并且对 Promise 不太了解,任何人都可以通过以下示例帮助我。我的 vs 代码没有突出显示 promise 语法。

module.exports = {
execSqlQuery: function (procedure, parameters) {
return new Promise(function (fulfill, reject) {
  var request = new sql.Request(connPool);
  parameters.forEach(function (parameter) {
    request.input(parameter.name, parameter.type, parameter.value);
  });
  request.execute(procedure, function (err, recordSets) {
    if (err) {
      reject(err);
    }
    else {
      fulfill(recordSets);
    }
  });
});
},

【问题讨论】:

  • await 用于等待 promise 解决。在您的情况下,由于request.execute(...) 是基于回调的,您首先需要一个围绕request.execute(...) 的promise 包装器,并且您已经拥有execSqlQuery 的形式。你可以await拨打execSqlQuery:const data = await execSqlQuery(...)
  • 您使用的是哪个 SQL 库,因为某些库本身就支持 Promise 方法,并且您不需要用 Promise 包装您的数据库执行。

标签: javascript node.js async-await promise


【解决方案1】:

首先,检查request.execute 是否有promise 版本而不是callback 版本。如果没有,您可以使用 promisify 库来实现它。

const util = require('util');
const execute= util.promisify(sql.execute); 

const execSqlQuery = async (procedure, parameters) => {     
    var request = new sql.Request(connPool);
    parameters.forEach(function (parameter) {
        request.input(parameter.name, parameter.type, parameter.value);
      });
    var recordSets = await  request.execute(procedure)
    return recordSets;
}

【讨论】:

  • 或者减少promise队列处理,return request.execute(procedure)
【解决方案2】:

我猜你使用的是 Microsoft SQL,如果是这样的话:https://www.npmjs.com/package/mssql#asyncawait

function async () {
  var request = new sql.Request(connPool);
  parameters.forEach(function (parameter) {
    request.input(parameter.name, parameter.type, parameter.value);
  });
  var res = await request.execute(procedure, function (err, recordSets);
  // now check the result for success or errors!
}

【讨论】:

    【解决方案3】:

    这个成功了

    const execSqlQuery = async (procedure, parameters) => {     
    var request = new sql.Request(connPool);
    parameters.forEach(function (parameter) {
        request.input(parameter.name, parameter.type, parameter.value);
      });
    var recordSets = await  request.execute(procedure)
    return recordSets;
    }
    

    【讨论】:

    • 除了回答您自己的答案,您是否可以接受有助于您解决问题的答案?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-16
    • 2013-07-01
    • 1970-01-01
    • 2018-01-11
    • 2021-05-17
    • 2015-12-13
    相关资源
    最近更新 更多