[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"site-settings":3,"site-stats":4,"post-13":5},true,null,[6,29],{"locked":7,"post":8},false,{"id":9,"authorId":10,"categoryId":11,"tagId":12,"title":13,"tip":14,"coverUrl":15,"content":16,"videoUrl":4,"views":17,"likes":18,"isPublished":3,"isRecommended":7,"isPinned":7,"allowComment":3,"createdAt":19,"updatedAt":20,"deletedAt":4,"category":21,"tag":24,"author":26,"liked":7},13,1,2,6,"JavaScript 异步编程演进之路","回调、Promise、async\u002Fawait，与事件循环的和解","https:\u002F\u002Fimg.sanshijiu.cn\u002Fpost\u002Fcover_05.jpg","## 从回调地狱说起\n\n```js\ngetUser(id, (user) => {\n  getOrders(user, (orders) => {\n    getDetail(orders[0], (detail) => { \u002F* 套娃 *\u002F });\n  });\n});\n```\n\n## Promise 带来链式救赎\n\n错误可以一路传递到 catch，代码从\"嵌套\"变成\"管道\"。\n\n## async\u002Fawait：同步的心，异步的命\n\n```js\nconst detail = await getDetail((await getOrders(await getUser(id)))[0]);\n```\n\n## 事件循环是理解一切的地基\n\n- 宏任务：setTimeout、setInterval、I\u002FO\n- 微任务：Promise.then、queueMicrotask\n- 每个宏任务之间，清空整个微任务队列\n\n## 小结\n\n写 JS 越久越明白：异步不是难题，只是心智模型要换。",489,38,"2026-07-23T17:06:40.000Z","2026-09-30T09:26:51.138Z",{"id":11,"name":22,"color":23},"前端",0,{"id":12,"name":25},"JavaScript",{"id":10,"nickname":27,"avatarUrl":28},"叁拾玖","https:\u002F\u002Fimg.sanshijiu.cn\u002Favatar\u002F1\u002F1787397803188bebb136a.jpg",{"prev":30,"next":33},{"id":31,"title":32},12,"Vue 3 Composition API 实践心得",{"id":34,"title":35},14,"CSS Flexbox 布局速查手册"]