Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.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_Mongodb_Express_Async Await_Promise - Fatal编程技术网

Javascript 如何将承诺转换为异步等待

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)=>{

这是我的模型,我可以使用它从Mongodb查找数据。我使用的是express js。但是,我想知道如何使用
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(顺便说一句,这是作者),所以我建议评论与我的答案无关,应该贴在问题本身上。但我们仍然不同意“你确实回答了问题,我没有回答”这一点,但我们还是到此为止吧。