# fed-e-task-01-01 **Repository Path**: cycodeer/fed-e-task-01-01 ## Basic Information - **Project Name**: fed-e-task-01-01 - **Description**: 作业 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-09-26 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README [题目](image/base.png) # 简答题 ## 问题1 对于JS的异步编程的理解,EventLoop和消息队列是干什么的,什么是宏任务和微任务? JS异步编程:JS为了避免多线程操作dom的安全性,所以只有一个线程在负责执行代码。但是为了解决耗时任务阻塞界面渲染造成的界面卡顿问题,引入了异步任务。异步任务运行过程为:JS主线程有一个调用栈,一个方法A内的同步方法顺序执行,遇到异步方法执行异步方法,然后异步线程执行异步任务,异步任务完成的回调函数进入消息队列,调用栈中任务结束后EventLoop将消息队列中的回调函数放入调用栈中执行。 Eventloop负责监听调用栈中任务,调用栈任务清空后Eventloop将消息队列中的任务放入调用栈中执行。 消息队列负责缓存异步任务的回调函数,先入先出,等待Eventloop将队列中的回调函数按顺序取出放入到调用栈执行。 宏任务&微任务:宏任务需要进入消息队列的末尾排队等待执行,例如setTimeout;微任务可以在本轮调用的末尾直接执行,不要重新排队例如Pormise,process.nextTick # 代码题 ## 优化代码 [优化后代码](code/optimized.js) 主要是利用Promise的链式调用优化 ## 基于以下代码完成练习 [代码](code/test1.js) ## 函子代码练习 [代码](code/app.js) ### 1 ex1 方法入参为需要增加的值,方法中先对maybe._value进行map,在map中的方法实现加法运算 返回携带新值的函子 ### 2 调用map方法执行first ### 3 首先获取name属性,safePorp返回一个函子,map中用first获取首字母, 返回值为携带首字母的函子 ### 4 将n转成maybe函子,maybe函子map方法执行parseInt # MyPromise ## 构造函数 入参为一个执行器,构造函数中用参数resolve和reject方法调用该执行器 ## 静态方法 resolve: 返回一个状态为FULFILLED的MyPromise对象 reject: 返回一个状态为REJECTED的MyPromise的对象 all: 返回一个MyPromise对象,所有入参MyPromise对象resolve后返回结果的MyPromise才resolve,否则返回结果的MyPromise执行reject ## 变量 status: 状态 value: 成功之后的值 reason: 失败的原因 successCallback: 成功的回调队列 failedCallBack: 失败的回调队列 ## 普通方法 resolve: 将状态由PENDING改为FULFILLED reject: 将状态由PENDING改为REJECTED finally: 无论promise对象状态是FULFILLED还是REJECTED都会执行finally catch: myPromise对象状态为REJECTED后会执行的回调, 将入参方法加入失败回调队列中