简答题
一、js异步编程实际是将部分js代码的执行滞后。js是单线程的,如果没有异步,对于某些耗时较大的操作,如异步获取数据,IO操作等,js将等待操作完成再执行下面的代码,这样会造成界面卡顿、白屏等现象。而js的异步编程就是用来解决这个问题的。
js在执行时,会将js代码解析成一个一个任务,然后依次执行。任务分为同步任务和异步任务。
- 同步任务
js在执行同步任务时会将任务添加到执行栈中并立即执行,等待任务执行完成之后再将其从执行栈中弹出。 - 异步任务
js在执行异步任务时,会经过相应的处理模块处理之后添加到任务队列中(也称消息队列)。在执行栈为空时,会从任务队列头部取出一个任务放到执行栈中执行,执行完成之后将其从执行栈中弹出。执行栈为空之后,会再次从任务队列里头部取出一个任务放到执行栈中执行,这个过程称为时间循环(即EventLoop)。
异步任务又分为宏任务和微任务
- 宏任务:需要进入到任务队列中重新排队的任务,如setTimeout、setInterval等
- 微任务:不需要重新进入到任务队列中重新排队的任务,如Promise、MutationObserver以及node中的process.nextTick。
执行栈为空之后,首先会从微任务队列中取出任务执行,待微任务队列为空之后再从宏任务队列中取出任务执行。
代码题
一、
1、使用Promise改进setTimeout
const p = val => new Promise((resolve, reject) => {
setTimeout(() => {
resolve(val)
}, 10)
});
p('hello').then(val => {
return p('lagou').then(value => val + value)
}).then(val => {
return p('I ♥ U').then(value => val + value)
}).then(console.log);
二、
1、使用fp.flowRigth重新实现isLastInStock
const isLastInStock = fp.flowRight(fp.props('in_stock'), fp.last);
2、使用fp.flowRight、fp.props、fp.first获取第一个car的name
const isFirstInName = fp.flowRight(fp.props('name'), fp.first);
3、使用函数组合实现averageDollarValue
const averageDollarValue1 = fp.flowRight(_average, fp.map(car => {
return car.dollar_value;
}));
4、使用fp.flowRight实现一个能让数组中name的转换为下划线连接的小写字母字符串
const sanitizeNames = fp.map(fp.flowRight(_underscore, fp.lowerCase, car => car.name));
三、
1、使用fp.add和fp.map创建一个能让functor里面的值增加的函数
const ex1 = (y) => {
return maybe.map(fp.map(fp.add(y)));
}
2、使用fp.first获取列表的首字母
const ex2 = () => {
return xs.map(fp