繁体   English   中英

Node.js 将等待/异步与承诺相结合

[英]Node.js combining await/async with promises

我连接到 Node 中的 Postgres 数据库,并从数据库中获得返回值。 但是,当我尝试将该值传递给另一个 function 时,该值是undefined 看看这段代码:

async function doDbCall(queryString) {
    await client.connect()
        .then(async () => {
            await client.query(queryString)
                .then(dbRes => {
                    console.log("dbDoCall - dbRes", dbRes.rows[0]);
                    return dbRes;
                })
                .catch(ex => {
                    throw ex;
                });
        })
        .catch(ex => {
            throw ex;
        })
        .finally(() => {
            client.end();
        });
}

这里是调用 function:

async function testTheDb() {
    try {
        const myReturnVal = await dbConn.doDbCall("SELECT NOW() as now");
        console.log("db val:", myReturnVal);
    }
    catch(ex) {
        console.log("db err", ex.message);
    }
}

在 query.then 成功的doDbCall()中的 console.log 中,我在 dbRes.rows[0] 中得到一个值。 console.log 显示dbDoCall - dbRes { now: 2022-09-26T16:47:14.465Z } 所以我返回那个值。

但是,在testTheDb() function 中,我有另一个控制台日志,其中记录了myReturnVal的值。 该日志的结果显示db val: undefined

我的问题是:为什么myReturnVal null 在 testTheDb() 中?

不应将async / await语法与.then()调用混用 您的问题是doDbCall function 和async () => {…}回调都不会返回任何内容,您唯一的return关键字嵌套在嵌套的then回调中。

你应该写

function doDbCall(queryString) {
    return client.connect()
        .then(() => {
            return client.query(queryString);
        })
        .then(dbRes => {
            console.log("dbDoCall - dbRes", dbRes.rows[0]);
            return dbRes;
        })
        .finally(() => {
            client.end();
        });
}

或者

async function doDbCall(queryString) {
    try {
        await client.connect()
        const dbRes = await client.query(queryString);
        console.log("dbDoCall - dbRes", dbRes.rows[0]);
        return dbRes;
    } finally {
        client.end();
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM