Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从异步函数中调用异步函数将返回未定义的_Javascript_Node.js_Async Await - Fatal编程技术网

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"});
}