Javascript promise返回变量时异步/等待

Javascript promise返回变量时异步/等待,javascript,Javascript,我在aws nodejs lambda函数中使用了async await的模式,我遇到的一个常见问题是需要等待承诺的结果,并在下一个async/await承诺中使用响应,然后重复这个模式,直到我运行完所有逻辑 let userId; await GetUserId({AccessToken: headers.accesstoken}).then(function(res){ userId = res; },function(err){ }); let username; await Get

我在aws nodejs lambda函数中使用了async await的模式,我遇到的一个常见问题是需要等待承诺的结果,并在下一个async/await承诺中使用响应,然后重复这个模式,直到我运行完所有逻辑

let userId;
await GetUserId({AccessToken: headers.accesstoken}).then(function(res){
 userId = res;
},function(err){

});

let username;
await GetUserName(userId).then(function(res){
 username = res;
},function(err){

});
无论如何,我都可以在调用函数的同一行中声明和分配userId值

sudo代码:

让userId=等待GetUserId()。然后(()=>{//bubble response up to userId})

我提出这个问题的原因是单独初始化一个变量有点混乱/错误。也许我需要一个不同的模式,或者这只是我不得不接受的东西

解决方案

var ExampleFunction=async()=>{
试一试{
const userId=await GetUserId('token');
const username=等待GetUserName(userId);
log(`userId:${userId}`);
log(`username:${username}`);
}捕捉(错误){
控制台日志(err);
log(`Exit Function`);
}
函数GetUserId(令牌){
返回新承诺(功能(解决、拒绝){
如果(!令牌)
拒绝(“无代币”);
解析('ID');
});
}
函数GetUserName(userId){
返回新承诺(功能(解决、拒绝){
如果(!userId)
拒绝(“无用户标识”);
解析(“名称”);
});
}
}

ExampleFunction()关键字wait使JavaScript等待,直到该承诺解析并返回其结果


let userId=wait GetUserId({AccessToken:headers.AccessToken})如果您将等待的结果分配给var,它将是承诺解析值

所以你可以

let userId = await GetUserId({AccessToken: headers.accesstoken});


注意:不要忘记使用try/catch进行错误处理。

等待
应该取代
然后
语法(除非您确实需要)。
await
表达式将拒绝原因作为异常抛出以捕获,或者导致承诺的实现值。您可以直接使用:

const userId = await GetUserId({AccessToken: headers.accesstoken});
const username = await GetUserName(userId);

(我假设您当前的代码忽略了错误并继续使用未定义的
值是无意的).

是,只需在回调中返回数据并使用该行。您认为处理变量声明的最佳方法是什么?这些需要单独包装在try-catch块中,以便控制我的lambda何时退出。一旦其中一个失败,我就不想再运行代码了,因为我没有依赖信息来执行函数中的其余逻辑。你不必单独包装它们。如果等待的承诺被拒绝,将抛出一个异常,并且像往常一样不再运行其他代码。异常会一直冒泡,直到被捕获。这会更干净,谢谢。我把我的答案放在这个问题上。
const userId = await GetUserId({AccessToken: headers.accesstoken});
const username = await GetUserName(userId);