繁体   English   中英

在node.js中使用Async / await的正确方法

[英]Correct way of using Async/await in node.js

我已经编写了一些代码来调用过程,它的OUT参数类型是cursor(ResultSet),所以我必须从ResultSet中获取数据,为此我编写了一个函数(fetchRowsFromRS()),该函数从ResultSet中提取数据。

  1. 我在fetchRowsFromRS()中使用了return语句,但未返回任何内容,但未定义。
  2. 当我调用fetchRowsFromRS()时,控件不会暂停下一行代码的执行(我已经使用了Async / await),这是必需的,因为我想在下一行中使用提取的数据。

我的代码有什么错误?

db.js

    connection.execute(plsql,bindvars,options,async function (err, result) {
          if (err) {
            console.log(err);
            console.error(err.message);
            doRelease(connection);
            return;
          }

      if(result.outBinds.OUT_STATUS=='SUCCESS'){

        if(result.outBinds.OUT_MENU_NAME.metaData.length=0){

        loginRes.getUserLoginServiceRes.Header.Status=aes.encryption('Failure');

        loginRes.getUserLoginServiceRes.Header.Status_Desc=aes.encryption('No record found in database');
       }else{

   loginRes.getUserLoginServiceRes.Header.Status=aes.encryption('Success');

   loginRes.getUserLoginServiceRes.Header.Status_Desc=aes.encryption('User 
       logged in successfully');
       var numRows=20;
       //calling function to fetch data from ResultSet
       var rsData=await fetchRowsFromRS(connection,result.outBinds.OUT_MENU_NAME,numRows)
    console.log('----------'+rsData);//giving undefined

    //here i want to use ResultSet Data

        }
      }
  })

从ResultSet中提取数据的函数(不返回任何内容)

function fetchRowsFromRS(connection, resultSet, numRows) {
     resultSet.getRows(numRows,function (err, rows) {
          if (err) {
            console.error(err);
            doClose(connection, resultSet);   // always close the ResultSet
          } else if (rows.length > 0) {
          console.log("fetchRowsFromRS(): Got " + rows.length + " rows");
          console.log(rows); //getting data here


          if (rows.length === numRows)      // might be more rows
            fetchRowsFromRS(connection, resultSet, numRows);
          else
            doClose(connection, resultSet); // always close the ResultSet


        } else { // no rows
          doClose(connection, resultSet);   // always close the ResultSet
        }
        return rows;
      });
  }

fetchRowsFromRS不返回任何内容。 您似乎没有正确使用异步/等待。 resultSet.getRows使用回调。 更改它以返回Promise或包装在Promise中并从fetchRowsFromRS 这样您就可以await它。

function fetchRowsFromRS(connection, resultSet, numRows) {
  return resultSet
    .getRows(numRows)
    .then(function(rows) {
      if (rows.length > 0) {
        console.log('fetchRowsFromRS(): Got ' + rows.length + ' rows')
        console.log(rows) //getting data here
        if (rows.length === numRows)
          // might be more rows
          fetchRowsFromRS(connection, resultSet, numRows)
        else doClose(connection, resultSet) // always close the ResultSet
      } else {
        // no rows
        doClose(connection, resultSet) // always close the ResultSet
      }
      return rows
    })
    .catch(function(err) {
      if (err) {
        console.error(err)
        doClose(connection, resultSet) // always close the ResultSet
      }
    })
}

如果resultSet.getRows(numRows)返回一个promise而不接受回调,或者resultSet.getRows(numRows)有一些替代方法返回一个promise,则以上方法将起作用。

等待fetchRowsFromRS(connection,resultSet,numRows)

仅当fetchRowsFromRS(connection,resultSet,numRows)返回一个promise 时才有效 ,而后者又需要函数中定义的所有内容才能返回一个promise。

要么

使用新的承诺

function fetchRowsFromRS(connection, resultSet, numRows) {
  return new Promise(function(resolve, reject) {
    resultSet.getRows(numRows, function(err, rows) {
      if (err) {
        console.error(err)
        doClose(connection, resultSet) // always close the ResultSet
        reject(err)
      } else if (rows.length > 0) {
        console.log('fetchRowsFromRS(): Got ' + rows.length + ' rows')
        console.log(rows) //getting data here

        if (rows.length === numRows)
          // might be more rows
          fetchRowsFromRS(connection, resultSet, numRows)
        else doClose(connection, resultSet) // always close the ResultSet
      } else {
        // no rows
        doClose(connection, resultSet) // always close the ResultSet
      }
      resolve(rows)
    })
  })
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM