promise 和 async/await
这两者都是异步解决方案,比callback要慢很多。但使用方便,被越来越多api支持,还是要学习了。
promise
callback 是函数,调用者调用cb的过程是函数调用,被调用的cb函数必须预先传递进去,所以:写法上有违直觉(后执行的要先写好),还会造成多层回调嵌套
解决办法promise,这是一个对象,可以保存 调用者 的执行状态和结果,所以被调用的cb可以后传递进去,由promise对象调用,同理,这个被调用者也可以继续把结果委托给promise对象,也解决的嵌套的问题。
注意的是,调用者是函数,promise仍然要预先传递过去,所以promise用法是:
let agent = new Promise((resolve,reject)=>{ // 真实的调用者在这里, ⚠️这个函数是立即执行的。假设执行结果是result // 把结果委托给resolve: resolve(result) }) agent.then((result)=>{ // 被调用的cb在这里 // 如果继续返回 Promise return new Promise(()=>{}) }).then(()=>{ // 这里也可以继续被调用的cb })
写法上,因为有了委托函数resolve,所以真正的回调可以写在后面,并且解决的嵌套的问题
调用者函数是立即执行的,后续代码也会继续执行(并行)
但由于js的事件队列的单线程模式,
后续代码执行是排在 调用者函数后面的,
resolve也是把cb添加到事件队列中
创建自己的Promise的方法:
把调用者函数放到Promise里面,
把传递给回调的结果传递给resolve
把回调cb写在then函数里。
await/async
await 是接受promise成功函数结果的另外一种方法
promise/resolve把结果(应该执行并传给then获得的函数),传给await,并赋值给await前面的变量
但这里的await 是会暂停后续代码执行的(跟上面提到的promise模式不相同)
所以,调用await 的函数要 要加上 async ,通知js引擎注意执行方式。
function agent(){ return new Promise(()=>{ // 调用者 }) // 注意,不添加 then } async function f(){ let r = await agent(); // 回调cb 放这里 cb(r); }
要注意的是 async 是把函数转变成一个 promise对象,所以 他也有上述两种方法获得结果。
这里可能会形成一个 async / await async / await 的嵌套地狱,
所以这个机制,只能保证 async函数内是阻塞执行,而async 外(整个js)执行依然是非阻塞的
参考资料:
promise
廖雪峰的入门课程
https://www.liaoxuefeng.com/wiki/1022910821149312/1023024413276544
简单解释过程
https://www.jianshu.com/p/1b63a13c2701
阮一峰的教程,比较全面
https://es6.ruanyifeng.com/#docs/promise
提到一些使用中的技巧和错误,不错
http://fex.baidu.com/blog/2015/07/we-have-a-problem-with-promises/
未看,有一些例子
https://juejin.im/post/5bcedb78e51d457b7d135746
赤裸裸的题目
http://www.fly63.com/article/detial/87
https://www.lizenghai.com/archives/39490.html
async/await
async和await
执行过程的理解
https://www.jianshu.com/p/b4fd76c61dc9
解释了本质,不错
https://segmentfault.com/a/1190000007535316
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现