无法解决对导出的异步函数 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);

});