基于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(); }
两者的逻辑完全一致:
- 都是先查询对应邮箱的用户,没找到就直接触发reject
- 找到用户后,对比密码——这里你还做了优化:原代码手动把bcrypt的回调包装成了Promise,而新版直接用
await调用bcrypt.compare(因为bcrypt本身已经支持Promise形式的调用,不需要手动包装了,这步很到位) - 密码对比成功就返回用户文档,失败则reject,和原代码的分支逻辑完全匹配
关于学习资源,给你几个实用的方向:
- 优先看MDN的异步编程章节里的async/await部分,它从基础语法、错误处理到实战场景都讲得很清晰,能帮你建立系统的认知
- 找一些Node.js异步编程的实战教程,里面通常会有Promise和async/await的对比案例,跟着练几次转换,很快就能熟练掌握
- 可以尝试给自己定小练习:把平时遇到的Promise链式调用代码改成async/await,反过来也试试,通过实操加深理解
备注:内容来源于stack exchange,提问作者Ahmad Benchakhtir
相关产品推荐
相关产品推荐

