You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Promise的函数转async/await写法的正确性验证及学习资源咨询

基于Promise的函数转async/await写法的正确性验证及学习资源咨询

嘿,你的async/await版本写得完全正确!咱们来对照原代码拆解下为什么没问题:

先看你原来的Promise链式调用代码:

function findByCredentials(email, password) {
  let UserModel = this;
  return UserModel.findOne({ email }).then((userDocument) => {
    if(!userDocument) return Promise.reject();
    return new Promise((res, rej) => {
      bcrypt.compare(password, userDocument.password, (err, res) => {
        if(res) return res(userDocument);
        else{ rej() }
      });
    })
  })
}

再看你转换后的async/await版本:

async function findByCredentials(email, password){
  let UserModel = this;
  const userDocument = await UserModel.findOne({ email });
  if(!userDocument) return Promise.reject();
  const compareResult = await bcrypt.compare(password, userDocument.password);
  if (compareResult) return userDocument;
  return Promise.reject();
}

两者的逻辑完全一致:

  1. 都是先查询对应邮箱的用户,没找到就直接触发reject
  2. 找到用户后,对比密码——这里你还做了优化:原代码手动把bcrypt的回调包装成了Promise,而新版直接用await调用bcrypt.compare(因为bcrypt本身已经支持Promise形式的调用,不需要手动包装了,这步很到位)
  3. 密码对比成功就返回用户文档,失败则reject,和原代码的分支逻辑完全匹配

关于学习资源,给你几个实用的方向:

  • 优先看MDN的异步编程章节里的async/await部分,它从基础语法、错误处理到实战场景都讲得很清晰,能帮你建立系统的认知
  • 找一些Node.js异步编程的实战教程,里面通常会有Promise和async/await的对比案例,跟着练几次转换,很快就能熟练掌握
  • 可以尝试给自己定小练习:把平时遇到的Promise链式调用代码改成async/await,反过来也试试,通过实操加深理解

备注:内容来源于stack exchange,提问作者Ahmad Benchakhtir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 15:19:32