模块一:函数式编程与JS 异步编程、手写Promise
简答题
一、谈谈你是如何理解JS异步编程的, EventLoop、消息队列都是做什么的, 什么是宏任务,什么是微任务?
代码题
一、将下面异步代码使用Promise 的方式改进
setTimeout(function () {
var a = 'hello'
setTimeout(function () {
var b = 'lagou'
setTimeout ( function
() {
var c= 'I ❤ U'
console. log(a + b + c)
},10)
},10)
},10)
二、基于以下代码完成下面的四个练习
const fp = require( ' lodash/fp')
//数据
// horsepower 马力,dollar_ value 价格,
in_ stock库存
const cars
=[
{ name: ' Ferrari FF', horsepower: 660,
dollar_ value: 700000, in_ stock: true },
{ name: ' Spyker
: C12 Zagato',
horsepower:
: 650,dollar_ _value:
648000,
in_ stock: false },
{ name: ' Jaguar XKR-S', horsepower :
550,dollar_ value: 132000,in_ stock:
false },
{ name: ' Audi R8', horsepower: 525,
dollar_ value: 114200, in_ stock: false },
{ name: ' Aston Martin 0ne-77',
horsepower: 750, dollar_ value: 1850000,
in_ stock: true },
{ name:' Pagani Huayra', horsepower :
700,dollar_ _value: 1300000, in_ stock:
false },
]
练习1:使用函数组合fp.flowRight()重新实现下面这个函数
let isLastInStock = function
(cars) {
//获取最后一条数据
let last_ car = fp.last (cars)
//获取最后一条数据的in stock 属性值
return fp.prop( ‘in_ stock’, last_ car)
}
练习2:使用fp.flowRight()、fp.prop() 和fp.first() 获取第一个car的name
练习3:使用帮助函数。average 重构averageDollarValue,使用函数组合的方式实现
Let average = function (xs) {
return fp.reduce(fp.add, 0,xs) /
Xs . length
} // <-无须改动
let averageDollarValue = function (cars )
{
let dollar values = f
fp.map( function
(car) {
return car . dollar_ value
},cars)
return_ average (dollar_ values)
}
**练习4:使用flowRight写- -个sanitizeNames()函 数,返回一个下划线连接的小写字符串,把数组中的name转换为这种形式:
例如: sanitizeNames([" Hello World" ]) => [“hello world”]
let underscore = fp. replace(/W+/g, ‘_’) // <-- 无须改动,并在sanitizeNames
中使用它**
三、基于下面提供的代码,完成后续的四个练习
// support.js
class Container {
static of (value) {
return new Container (value)
r(
}
constructor(value) {
this._ value = value
}
map(fn) {
return Container.of( fn(this._ value))
}
}
class Maybe {
static of(x) {
return new Maybe(x)
}
isNothing() {
return this. value
null |l
this. value
一
=一一=
undefined
}
constructor(x) {
this. value = x
}
map(fn) {
return this. isNothing() ? this :
Maybe .of (fn(this. _value))
}
}
module. exports = { Maybe,
Container }
练习1:使用fp.add(x, y)和fp.map(f, x)创建一个能让functor里的值增加的函数ex1
// app.js
const fp
= require( ’ lodash/fp’ )
const { Maybe, Container }
require(’ ./support’ )
let maybe = Maybe.of([5, 6,1])
letex1=()=>{
//你需要实现的函数。。。
}
练习2:实现-一个函数ex2,能够使用fp.first获取列表的第一一个元素
// app.js
const fp = require(‘lodash/fp’)
(
const { Maybe, Container
”}
require(’./support’ )
let Xs = Container.of([‘do’ ,‘ray’,
‘me’, ‘fa’, ‘so’, ‘la’, ‘ti’, ‘do’ ])
let ex2 =
() =>{
//你需要实现的函数。。。
}
练习3:实现一个函数ex3,使用safeProp和fp.first找到user的名字的首字母
// app.js
const fp
) = require( ‘lodash/fp’)
const { Maybe,
Container }
require( ’ ./support’ )
let safeProp
= fp.curry( function
(x, o)
{
return Maybe.of (o[x] )
})
let user = { id: 2,name: ’ Albert’ }
let ex3 =
()
)= >
{
//你需要实现的函数。
}
练习4:使用Maybe重写ex4,不要有if语句
// app.js
const fp = require( ‘lodash/fp’ )
const { Maybe,
Container }
require(’./support’)
let ex4 = function (n) {
if (n) {
return parseInt(n)
}
}
四、手写实现MyPromise源码 要求:尽可能还原Promise中的每-一个API,并通过 注释的方式描述思路和原理。