Правильный способ использования Async / await в node.js - PullRequest
0 голосов
/ 18 ноября 2018

Я написал некоторый код для вызова процедуры, тип параметра OUT - курсор (ResultSet), поэтому мне нужно извлечь данные из ResultSet, для этого я написал одну функцию (fetchRowsFromRS ()), которая извлекает данные из ResultSet .

  1. Я использовал оператор return в fetchRowsFromRS (), но не возвращал что-нибудь, становится неопределенным.
  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;
      });
  }

Ответы [ 2 ]

0 голосов
/ 18 ноября 2018
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) возвращает обещание вместо принятия обратного вызова или есть альтернатива для resultSet.getRows (numRows) , которая возвращает обещаю.

await fetchRowsFromRS (соединение, набор результатов, numRows)

будет работать, только если fetchRowsFromRS (connection, resultSet, numRows) возвращает обещание, что, в свою очередь, требует, чтобы все, что определено внутри функции, возвращало обещание.

OR

Использовать Новое обещание

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)
    })
  })
}
0 голосов
/ 18 ноября 2018

fetchRowsFromRS ничего не возвращает.Вы, кажется, неправильно используете async / await.resultSet.getRows использует обратный вызов.Измените его так, чтобы оно возвращало обещание или заверните его в обещание и верните его из fetchRowsFromRS.Тогда вы сможете await это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...