Javascript 从异步函数中调用异步函数将返回未定义的
(如果题目对这个问题不准确,请原谅我,这是一个令人难以置信的问题) 我的应用程序要求我根据数据库检查请求中的值。为此,我创建了一个异步函数来查询数据库:Javascript 从异步函数中调用异步函数将返回未定义的,javascript,node.js,async-await,Javascript,Node.js,Async Await,(如果题目对这个问题不准确,请原谅我,这是一个令人难以置信的问题) 我的应用程序要求我根据数据库检查请求中的值。为此,我创建了一个异步函数来查询数据库: async function checktoken(){ return prisma.$exists.invalidtoken({token: "testtoken"}).then(result => { return(result) }) } 我知道数据库需要自己的工作: prisma.$exists.
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():
修改函数以包含对数据库的显式调用,但只有在函数前面定义了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/Wait有一个基本的误解,但我不确定我到底错过了什么
编辑:
我已经根据收到的建议更新了我的方法,但仍然不起作用。我开始觉得我的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
};
异步函数需要等待。如果您使用的是promise.then()技术,那么您要做的是返回一个新的promise(),并在.then回调函数中解析该promise
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"});
}
是的,您可以看到
然后回调本身就是一个函数,因此return
关键字将返回回调,而不是getUser
函数。用承诺来包装它并解决它。或者正如@JamiesonRhyne所提到的,async/await
没有then
回调将同样有效。.then(result=>{return result})
显示了对promise构造函数反模式缺乏理解。第一个应该是:function checktoken(){return prisma.$exists.invalidtoken({token:“testtoken”});}
。第二个缺少return
语句(和function
关键字):async function checktoken(){return wait prisma.$exists.invalidtoken({token:'testtoken});
,但是使用async
函数没有任何好处,可能只是为了清楚起见。我尝试了你的第二种技术(添加了一些调试)我不能说它工作正常。我开始认为我的ORM做了一些奇怪的事情。我同意Felix的观点,示例一中唯一的价值是,如果你需要执行一些额外的工作,而不仅仅是返回结果。Dov,请确保你明白,在这两个承诺下,后续的代码行将继续执行,只有在完成之后letion将触发.then回调中的代码,随后的行将一直运行到那时。因此,请确保调用checktoken的人正在等待结果或将依赖代码放入回调中,如checktoken()。然后((token)=>dodependentwork());
async checktoken() {
await prisma.$exists.invalidtoken({token: "testtoken"});
}