# camp 1-1 函数式编程 异步编程 **Repository Path**: hj-min/fed-e-task-01-01 ## Basic Information - **Project Name**: camp 1-1 函数式编程 异步编程 - **Description**: No description available - **Primary Language**: JavaScript - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-09-19 - **Last Updated**: 2021-11-03 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 函数式编程、异步编程、手写Promise ------ ### 简答题 一、谈谈你是如何理解JS异步编程的,EventLoop、消息队列都是做什么的,什么是宏任务,什么是微任务? (1)JS异步编程 JS异步编程出现原因:JS是单线程的,大量耗时的操作需要异步完成,比如ajax、计时任务等,异步编程主要是处理这部分工作。 JS异步编程的演化: 1. 回调函数。 - 解决了同步问题 - 但存在回调地狱问题,代码可读性、可维护性较差,嵌套过多错误难以处理。 2. 事件监听、发布-订阅。 3. Promise。 - 使用链式调用,解决了回调地狱问题 - 但promise无法取消;如果不设置失败回调,内部抛出错误,不会反应到外部;pending状态无法知道具体进展。 4. generator。函数执行可控,配合co使用。 5. async / await。使用看起来和同步代码一样的方式完成异步编程。 - 代码清晰 - 多个异步操作无依赖关系时,不适合使用await(减低性能) (2)事件循环机制和消息队列 1. JS主线程依次执行代码,遇到同步任务,直接放入执行栈执行后出栈,遇到异步任务,交给定时器线程或网络请求线程处理,注册回调函数。 2. 在计时结束或异步请求返回时,(事件触发线程)将注册的回调放入消息队列尾部。 3. 当主线程任务执行完毕时,会从消息队列头部取出任务执行,执行完毕后重复此过程。 主线程从“任务队列”中读取事件,这个过程是循环不断的,这种运行机制称为Event Loop(浏览器的事件循环机制)。 消息队列,就是主线程存放这些等待执行的异步任务回调维护的一个队列。 (3)宏任务、微任务 - 宏任务:setTimeout、setInterval计时器、requestAnimationFrame创建的就是宏任务。 - 微任务:promise、MutationObserver、process.nextTick等创建的就是微任务。 - 事件循环机制:先执行主线程,然后执行微任务,最后执行宏任务。 ### 代码题 一、Promise 优化异步代码 详见 `code/1-promise-replace-callback.js` 二、loadsh-fp 模块练习。 详见 `code/2-lodash-fp.js` 三、函子练习。 详见 `code/app.js` 四、手写 Promise 详见 `code/4-MyPromise.js`