Javascript 如何将承诺转换为异步等待
这是我的模型,我可以使用它从Mongodb查找数据。我使用的是express js。但是,我想知道如何使用Javascript 如何将承诺转换为异步等待,javascript,mongodb,express,async-await,promise,Javascript,Mongodb,Express,Async Await,Promise,这是我的模型,我可以使用它从Mongodb查找数据。我使用的是express js。但是,我想知道如何使用asyncwait来做与上述承诺完全相同的事情。我的意思是,我想将此代码转换为异步方式 非常感谢您的帮助。这就足够了: login() { return new Promise((resolve, reject) => { userCollection.findOne({email: this.data.email}).then((myUser)=>{
async
wait
来做与上述承诺完全相同的事情。我的意思是,我想将此代码转换为异步方式
非常感谢您的帮助。这就足够了:
login() {
return new Promise((resolve, reject) => {
userCollection.findOne({email: this.data.email}).then((myUser)=>{
if (myUser && myUser.password == this.data.password) {
resolve("Congrats! Successfully logged in");
} else{
reject("Login failed");
}
}).catch(()=>{
reject("Please try again later")
})
})
}
重复您的案例将导致:
async function login() {
try {
const user = await userCollection.findOne({ email: this.data.email });
if (user && user.password === this.data.password) {
// handle valid user
}
else {
// handle not found user or password mismatch
}
}
catch (error) {
// handle or rethrow error
}
}
然后,在您的呼叫者代码中,您可以等待
(或。然后()
它,但更喜欢等待
)登录结果:
async function login() {
try {
const user = await userCollection.findOne({ email: this.data.email });
if (user && user.password === this.data.password) {
return 'Congrats! Successfully logged in';
}
else {
throw new Error('Login failed');
}
}
catch (error) {
throw new Error('Please try again later');
}
}
请注意,在执行此操作时,您将再次需要将调用方函数标记为async
,以便能够使用wait
操作符。这就足够了:
login() {
return new Promise((resolve, reject) => {
userCollection.findOne({email: this.data.email}).then((myUser)=>{
if (myUser && myUser.password == this.data.password) {
resolve("Congrats! Successfully logged in");
} else{
reject("Login failed");
}
}).catch(()=>{
reject("Please try again later")
})
})
}
重复您的案例将导致:
async function login() {
try {
const user = await userCollection.findOne({ email: this.data.email });
if (user && user.password === this.data.password) {
// handle valid user
}
else {
// handle not found user or password mismatch
}
}
catch (error) {
// handle or rethrow error
}
}
然后,在您的呼叫者代码中,您可以等待
(或。然后()
它,但更喜欢等待
)登录结果:
async function login() {
try {
const user = await userCollection.findOne({ email: this.data.email });
if (user && user.password === this.data.password) {
return 'Congrats! Successfully logged in';
}
else {
throw new Error('Login failed');
}
}
catch (error) {
throw new Error('Please try again later');
}
}
请注意,在执行此操作时,您需要再次将调用者函数标记为
async
,以便能够使用wait
操作符。这是否回答了您的问题?恐怕不行。你可能不这么认为,但我建议你再看看。这段代码是一个众所周知的反模式:没有理由像dupe所指出的那样在newpromise
中包装承诺。您可以等待承诺,或者直接返回承诺,而不是添加额外的间接层。即使它没有回答这个问题,我也看不到有人试图在这里添加async
或wait
关键字,因此它看起来像是一个“为我做”的请求(主题外;太宽泛),而不是一个“帮助我尝试失败”的问题(主题上)。这回答了你的问题吗?恐怕不行。你可能不这么认为,但我建议你再看看。这段代码是一个众所周知的反模式:没有理由像dupe所指出的那样在newpromise
中包装承诺。您可以等待承诺,或者直接返回承诺,而不是添加额外的间接层。即使它没有回答这个问题,我也看不到有人试图在这里添加async
或wait
关键字,因此它看起来像是一个“为我做”的请求(主题外;太宽泛),而不是一个“帮助我尝试失败”的问题(主题上)。为什么不…findOne({email:this.data.email,password:this.data.password})
?@codemonkey这是一个正确的观点,但我不确定这个问题是否应该向我提出。问题是如何将承诺语法转换为async
/await
语法。无论如何,我同意这是可以优化的。@ggorlen再一次,你应该向作者而不是我提出这个问题。另外,我认为你完全没有抓住问题的重点。@ggorlen“为什么不…”的建议并不像你可能看到的那样来自作者。在任何情况下,使用提及来处理特定用户的评论都是一个很好的做法,因为这可以保持对话的流畅性和可理解性。此外,重复的建议并没有回答作者的问题,它只是指出了作者在代码中使用的一个不好的实践。总而言之-此答案下的所有评论都与之无关,应该放在问题本身上。@ggorlen我真的不明白你在说什么。我没有说过设计问题应该被忽略。我刚刚给了你一个建议,当你为了讨论的目的向某人讲话时,使用提及功能。而且,就像我说的,你没有回答问题的作者,你是在回答codemonkey和我,我们都不是OP(顺便说一句,这是作者),所以我建议评论与我的答案无关,应该贴在问题本身上。但我们仍然不同意“你确实回答了问题,我没有回答”这一点,但让我们就此结束。为什么不…findOne({email:this.data.email,password:this.data.password})
?@codemonkey这是一个正确的观点,但我不确定该向我提出这个问题。问题是如何将承诺语法转换为async
/await
语法。无论如何,我同意这是可以优化的。@ggorlen再一次,你应该向作者而不是我提出这个问题。另外,我认为你完全没有抓住问题的重点。@ggorlen“为什么不…”的建议并不像你可能看到的那样来自作者。在任何情况下,使用提及来处理特定用户的评论都是一个很好的做法,因为这可以保持对话的流畅性和可理解性。此外,重复的建议并没有回答作者的问题,它只是指出了作者在代码中使用的一个不好的实践。总而言之-此答案下的所有评论都与之无关,应该放在问题本身上。@ggorlen我真的不明白你在说什么。我没有说过设计问题应该被忽略。我刚刚给了你一个建议,当你为了讨论的目的向某人讲话时,使用提及功能。而且,就像我说的,你没有回答问题的作者,你是在回答codemonkey和我,我们都不是OP(顺便说一句,这是作者),所以我建议评论与我的答案无关,应该贴在问题本身上。但我们仍然不同意“你确实回答了问题,我没有回答”这一点,但我们还是到此为止吧。