从异步函数内调用异步函数将返回undefined

问题描述 投票:2回答:1

(请原谅我,如果标题不准确,这个问题令人难以置信)我的应用程序要求我检查请求中对数据库的值。为此,我创建了一个异步函数来查询数据库:

async function checktoken(){
    return prisma.$exists.invalidtoken({token: "testtoken"}).then(result => {
        return(result)
    })
}

我知道数据库调用自己的工作原理:

prisma.$exists.invalidtoken({token: "testtoken"}).then(result => {
    console.log(result) // returns true 
})

在每个请求触发的函数中,我尝试调用checktoken():

async function getUser(token){
    var promise = await checktoken()
    var result = promise 
    console.log(result) //undefined
};

修改函数以包含对数据库的显式调用,但仅在以前定义var promise = await checktoken()时才有效:

async function getUser(token){
    var promise = await checktoken() //When this is removed result1 is undefinded

    await prisma.$exists.invalidtoken({token: "testtoken"}).then(result1 => {
        console.log("inside db call: "+result1) // true
    })
};

我想我对async / await有一个基本的误解,但我不确定我到底错过了什么。

编辑:我已经根据我收到的建议更新了我的方法,但仍然无效。我开始认为我的ORM正在做一些奇怪的事情:

async function test(token) {
    const status = await prisma.$exists.invalidtoken({ token: token });
    console.log(status);
    return status;
}

test("123") //logs false (as it should)

async function getUser(token){
    var status = await test(token) //logs undefined
    console.log(status) //logs undefined
};
javascript node.js async-await
1个回答
1
投票

异步功能需要等待。如果你正在使用promise.then()技术,那么你想要做的是返回一个新的Promise(),并在.then回调函数中解决这个问题

function checktoken() { 
    return new Promise((resolve,reject) => {
        prisma.$exists.invalidtoken({token: "testtoken"}).then(result => { 
            doSomeOtherStuff();
            resolve(result);
        });
    });
}

在功能上是相同的

async checktoken() {
    await prisma.$exists.invalidtoken({token: "testtoken"});
}
© www.soinside.com 2019 - 2024. All rights reserved.