无法解决对导出的异步函数 NodeJS 的承诺
Can't resolve a promise on exported async function NodeJS
所以我在导出异步函数时遇到了这个问题:
async function getItemData(callback) {
let result = await pool.getConnection(async function(err, con) {
if (err) throw err;
let queryPromise = await new Promise((resolve, reject)=> {
con.query("SELECT * FROM customers", function(err, rows) {
if (err) {
console.log(err);
reject(err);
} else {
console.log('Found records : ' + rows.length);
resolve(rows);
}
});
});
});
}
module.exports.getItemData = getItemData;
这里是调用它的地方:
app.listen(port, function () {
console.log('Api server is listening on port '+ port);
// Call the async function
(async () => {
let result = await driver.getItemData();
console.log(result);
)();
});
promise 中的 console.log 有效。但是console.log函数外的returns未定义。
知道为什么吗?
两期:
- 您的函数没有 returning 任何东西,那么为什么要定义
result
?
- 我怀疑
getConnection()
不是异步函数。您将异步函数作为回调传递,但这不会使函数本身异步。因此,您的 await
什么都不做。
您可以尝试将整个函数包装在 Promise
和 return 中,如下所示:
async function getItemData() {
return new Promise((resolve, reject)=> {
pool.getConnection(function(err, con) {
if (err) return reject(err);
con.query("SELECT * FROM customers", function(err, rows) {
if (err) {
console.log(err);
reject(err);
} else {
console.log('Found records : ' + rows.length);
resolve(rows);
}
});
});
});
}
module.exports.getItemData = getItemData;
同样在你的其他文件中,我只是让整个函数异步,这样你就不需要那个丑陋的包装器了:
app.listen(port, async () => {
console.log('Api server is listening on port '+ port);
let result = await driver.getItemData();
console.log(result);
});
所以我在导出异步函数时遇到了这个问题:
async function getItemData(callback) {
let result = await pool.getConnection(async function(err, con) {
if (err) throw err;
let queryPromise = await new Promise((resolve, reject)=> {
con.query("SELECT * FROM customers", function(err, rows) {
if (err) {
console.log(err);
reject(err);
} else {
console.log('Found records : ' + rows.length);
resolve(rows);
}
});
});
});
}
module.exports.getItemData = getItemData;
这里是调用它的地方:
app.listen(port, function () {
console.log('Api server is listening on port '+ port);
// Call the async function
(async () => {
let result = await driver.getItemData();
console.log(result);
)();
});
promise 中的 console.log 有效。但是console.log函数外的returns未定义。 知道为什么吗?
两期:
- 您的函数没有 returning 任何东西,那么为什么要定义
result
? - 我怀疑
getConnection()
不是异步函数。您将异步函数作为回调传递,但这不会使函数本身异步。因此,您的await
什么都不做。
您可以尝试将整个函数包装在 Promise
和 return 中,如下所示:
async function getItemData() {
return new Promise((resolve, reject)=> {
pool.getConnection(function(err, con) {
if (err) return reject(err);
con.query("SELECT * FROM customers", function(err, rows) {
if (err) {
console.log(err);
reject(err);
} else {
console.log('Found records : ' + rows.length);
resolve(rows);
}
});
});
});
}
module.exports.getItemData = getItemData;
同样在你的其他文件中,我只是让整个函数异步,这样你就不需要那个丑陋的包装器了:
app.listen(port, async () => {
console.log('Api server is listening on port '+ port);
let result = await driver.getItemData();
console.log(result);
});