Javascript 承诺将未定义的结果返回回调
我在获取回调函数的结果时遇到问题。下面是我正在调用的异步函数Javascript 承诺将未定义的结果返回回调,javascript,node.js,promise,mariadb,Javascript,Node.js,Promise,Mariadb,我在获取回调函数的结果时遇到问题。下面是我正在调用的异步函数 const utils = { sendQuery: async function(query){ // Receives a query and returns raw results // Query is using default database specified by pool // Returns a Promise let conn;
const utils = {
sendQuery: async function(query){
// Receives a query and returns raw results
// Query is using default database specified by pool
// Returns a Promise
let conn;
try {
conn = await pool.getConnection();
let queryString = query;
let rows = await conn.query(queryString);
let results = (this.formatResults(rows));
console.log(results);
return results;
} catch(err) {
throw new Error(err);
} finally {
if (conn) return conn.end();
}
}
module.exports = {
'utils': utils
}
上面的控制台日志返回预期结果
下面是调用上述函数的函数
const db = require('../private/db');
db.utils.sendQuery(queryString).then(function(result){
console.log(result);
}).catch(err=>{
throw res.render('error', {'error': err.stack});
})
上面的控制台日志返回未定义,我不知道原因。在我看来,只返回
结果
,而不是解析(结果)
。您的函数已经是异步的,这里没有创建承诺对象。
只需抛出err
,而不是reject(err)代码>
由于您返回的是try
,因此不需要您的finally
语句。您只需返回结果,而不需要调用resolve
const-utils={
sendQuery:异步函数(查询){
//接收查询并返回原始结果
//查询正在使用池指定的默认数据库
//回报承诺
让康涅狄格州;
试一试{
conn=wait pool.getConnection();
让queryString=query;
让rows=wait conn.query(queryString);
让results=(this.formatResults(rows));
控制台日志(结果);
返回结果;
}捕捉(错误){
抛出新错误(err)
}最后{
如果(连接)返回连接端();
}
}
module.exports={
“utils”:utils
}
您可以直接返回,或者我想这就是您要做的
sendQuery: (query) => {
let promise = new Promise(async (resolve, reject) => {
let conn;
try {
conn = await pool.getConnection();
let queryString = query;
let rows = await conn.query(queryString);
let results = (this.formatResults(rows));
console.log(results);
resolve(results);
} catch (err) {
reject(err);
} finally {
if (conn) {
conn.end();
}
}
})
return promise;
}
这里真正的问题是这部分如果(conn)返回conn.end();
无论何时使用finally
,它都将覆盖在所述try
或catch
块中发生的任何先前返回
、中断
、继续
或抛出
要解决您的问题,您应该这样做:
const utils = {
sendQuery: async function(query){
// Receives a query and returns raw results
// Query is using default database specified by pool
// Returns a Promise
let conn;
try {
conn = await pool.getConnection();
let queryString = query;
let rows = await conn.query(queryString);
let results = (this.formatResults(rows));
console.log(results);
return results;
} catch(err) {
throw new Error(err);
} finally {
if (conn) conn.end();
}
}
module.exports = {
'utils': utils
}
希望它能工作您好,谢谢您的回复。它仍然不工作。我尝试在try语句内外抛出错误,只是为了测试catch是否会被调用,它是否能工作。您得到结果了吗?只需尝试抛出错误(err)
奇怪的是,当我在wait之后添加抛出错误时,它似乎没有抛出错误,并在调用它的函数上运行then。呜?????啊,错过了!你需要从finally
块中删除return。正如上面的回答所述。哦,哇,这很有效!谢谢。我今天学到了一些新的东西。这部分代码我从mariadb驱动程序nodejs文档中获取。