JS 冒泡 (mark)

在书写页面的JS 时候, 可能我们在促发一个事件的时候会有多个方法对其有响应。

 

 JS 这种单事件多响应   是依靠事件传播完成的

 

 JS 的事件传播是单向的 , 即 冒泡  向父容器传播 , 这点和FLASH 不一样(flash 默认是双向的)

 

 如果我们需要屏蔽父容器对于的时间处理方法   只需要停止事件的传播即可

 

 

 方法如下:

 

html 调用

 

 

<think>好的,我现在需要回答用户关于“JavaScript异步”的问题。用户之前已经询问过AJAX和XHR,现在转向异步机制,这可能是他们学习JavaScript的进阶内容。首先,我要确保自己理解JavaScript异步编程的核心概念,包括事件循环、回调函数、Promise、async/await等。 用户可能已经了解同步和异步的区别,但可能需要更深入的解释。我需要从基础开始,逐步引导他们理解异步的重要性以及JavaScript如何处理异步操作。要注意使用用户之前接受的格式,比如分点解释、代码示例以及可能的技术对比。 我需要考虑用户可能的疑问点,比如为什么需要异步?回调地狱是什么?Promise如何解决这个问题?async/await又是怎样的语法糖?此外,用户可能对事件循环机制不太清楚,需要简明扼要地解释,避免过于复杂。 同时,用户之前的问题涉及到XHR和Fetch API,这些都是异步操作的具体应用,所以可以结合之前的例子来说明异步的使用场景。例如,在AJAX请求中使用回调或Promise处理响应。 还需要注意用户的技术水平,可能不太熟悉底层概念,所以需要用简单的比喻或类比来解释事件循环,比如厨房中的厨师处理多个订单的例子。此外,代码示例要清晰,注释详细,帮助用户理解每一步的作用。 在结构上,应该按照用户之前接受的层次结构,分核心概念、技术实现、对比、代码示例、特殊场景等部分。但要根据异步的主题调整内容,确保逻辑连贯,覆盖所有关键点。 另外,用户可能对异步错误处理感兴趣,比如try/catch在async/await中的使用,或者Promise的catch方法。需要包括这些内容,并提供示例说明如何处理异步中的异常。 还要考虑现代JavaScript的发展,比如Promise和async/await已经成为主流,但也要提到传统的回调方式,以便用户理解现有代码库中的模式。同时,可以简要提及生成器(Generators)和异步迭代,但可能作为进阶内容,不过分深入。 最后,总结部分需要强调异步编程的重要性,以及不同方法的选择场景,帮助用户在实际项目中做出合适的技术决策。需要确保回答准确、全面,同时避免过于技术化的术语,保持易懂。</think>### **JavaScript异步编程深度解析** --- #### **1. 同步 vs 异步的本质区别** - **同步执行** $$ \text{代码顺序执行} \Rightarrow \text{阻塞式处理} $$ ```javascript console.log("开始煮面"); const noodles = cookNoodlesSync(); // 阻塞30分钟 console.log("面条煮好了"); // 30分钟后执行 ``` - **异步执行** $$ \text{非阻塞架构} \Rightarrow \text{事件驱动模型} $$ ```javascript console.log("开始煮面"); cookNoodlesAsync(() => { console.log("面条煮好了"); // 30分钟后触发 }); console.log("我可以先切菜"); // 立即执行 ``` --- #### **2. JavaScript异步核心机制** **事件循环(Event Loop)工作流** ```mermaid graph TD A[调用栈] -->|执行同步代码| B(Web APIs) B -->|定时器/网络请求| C[任务队列] C -->|事件循环检查| D{调用栈是否空?} D -->|是| A D -->|否| C ``` **关键要素**: - **调用栈(Call Stack)**:同步代码执行场所 - **Web APIs**:浏览器提供的异步接口(`setTimeout`, `XHR`等) - **任务队列(Task Queue)**:宏任务(`setTimeout`)、微任务(`Promise`) - **事件循环**:持续检查调用栈与队列的调度器 --- #### **3. 异步编程演进史** | 阶段 | 技术方案 | 典型代码结构 | 主要问题 | |------------|--------------------|----------------------------------|----------------------------| | **青铜时代** | 回调函数 | `fs.readFile('a.txt', callback)` | 回调地狱(Callback Hell) | | **白银时代** | Promise | `.then().catch()` | 链式调用冗余 | | **黄金时代** | async/await | `try{ await } catch{}` | 需要ES7+环境支持 | | **未来趋势** | 顶层await + ES模块 | `const data = await fetch()` | 模块加载顺序控制 | --- #### **4. 关键技术实现对比** **回调函数 vs Promise vs async/await** ```javascript // 回调地狱示例 getUser(id, user => { getProfile(user, profile => { getOrders(profile, orders => { console.log(orders); }); }); }); // Promise链式调用 getUser(id) .then(user => getProfile(user)) .then(profile => getOrders(profile)) .then(orders => console.log(orders)) .catch(err => console.error(err)); // async/await终极方案 async function loadData() { try { const user = await getUser(id); const profile = await getProfile(user); const orders = await getOrders(profile); console.log(orders); } catch (error) { console.error("加载失败:", error); } } ``` --- #### **5. 微任务与宏任务的执行顺序** $$ \text{微任务优先级} > \text{宏任务} $$ ```javascript console.log('开始'); setTimeout(() => console.log('宏任务'), 0); Promise.resolve() .then(() => console.log('微任务1')) .then(() => console.log('微任务2')); console.log('结束'); /* 输出顺序: 开始 结束 微任务1 微任务2 宏任务 */ ``` **常见任务类型**: - **宏任务**:`setTimeout`, `setInterval`, `I/O`, UI渲染 - **微任务**:`Promise.then`, `MutationObserver`, `queueMicrotask` --- #### **6. 高级异步模式** **并行处理优化** ```javascript // 错误方式(顺序执行) const a = await fetchA(); const b = await fetchB(); // 需等待A完成 // 正确方式(并行执行) const [a, b] = await Promise.all([fetchA(), fetchB()]); ``` **竞速模式(race condition)** ```javascript const timeout = ms => new Promise((_, reject) => setTimeout(() => reject(new Error('超时')), ms)); await Promise.race([ fetchData(), timeout(5000) // 5秒超时机制 ]); ``` --- #### **7. 异步错误处理精髓** **多层级错误冒泡** ```javascript async function main() { try { await step1(); } catch (error) { console.error('步骤1失败:', error); await sendErrorReport(error); // 错误上报 throw new Error('流程终止'); // 继续向上冒泡 } } main().catch(finalError => { console.error('全局捕获:', finalError); }); ``` **finally的妙用** ```javascript let isLoading = true; try { await fetchData(); } finally { isLoading = false; // 无论成功失败都会执行 } ``` --- #### **8. 现代浏览器新特性** **Top-level await** ```html <script type="module"> const data = await fetch('/api/config'); // 模块顶层直接使用await initializeApp(data); </script> ``` **Web Workers多线程** ```javascript // main.js const worker = new Worker('task.js'); worker.postMessage(heavyData); worker.onmessage = e => console.log(e.data); // task.js self.onmessage = function(e) { const result = process(e.data); self.postMessage(result); }; ``` --- ### **实践建议** 1. **优先使用async/await**:代码可读性接近同步写法 2. **避免过度嵌套**:合理使用`Promise.all`/`Promise.any` 3. **错误边界处理**:在适当层级添加try/catch 4. **性能监控**:使用`performance.mark`测量关键异步操作耗时 5. **内存管理**:及时取消未完成的`fetch`请求(AbortController) ```javascript const controller = new AbortController(); // 超时自动取消 setTimeout(() => controller.abort(), 5000); fetch(url, { signal: controller.signal }).catch(err => { if (err.name === 'AbortError') { console.log('请求被主动取消'); } }); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值