[英]Correct way of using Async/await in node.js
我已经编写了一些代码来调用过程,它的OUT参数类型是cursor(ResultSet),所以我必须从ResultSet中获取数据,为此我编写了一个函数(fetchRowsFromRS()),该函数从ResultSet中提取数据。
我的代码有什么错误?
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.