题目
请实现serialize办法
serialize([ log(1), log(2), sleep(3), log(4)]).done(() => { console.log('done')})// 输入:1 2 3 4 donefunction log (x) { return () => console.log(x)}function sleep (y) { return () => new Promise((resolve) => { setTimeout(() => { resolve(y) }, 0) })}
题目剖析
- serialize入参是一个工作数组,且会返回一个done办法
- 输入是依据入参的工作一个一个执行,所以是串行执行
- done办法示意全副工作实现,所以它的回调能够了解成就是个同步回调
重点是如何实现串行执行,失常的执行流是event_loop模型,这个不在这里追述。串行执行的实质是,下一个工作是上一个工作的回调,链式操作。很天然会想到promise的then办法的链式调用。
我的答案
function isPromise (obj) { return typeof obj === 'object' && typeof obj.then === 'function'}function serialize (arr) { let promiseResolver = Promise.resolve() arr.forEach(item => { let result promiseResolver = promiseResolver.then(() => { // 同步工作间接执行 result = item(); // 异步工作间接返回,并写一个回调执行console if (isPromise(result)) { return result.then(x => { console.log(x) }) } }) }) return { done: (fn) => { promiseResolver = promiseResolver.then(() => {fn()}); } }}
复盘
- 第一遍审题的时候没有审分明,没有留意到重点是串行,认为第三点是重点
- 在面试官揭示做错了之后,而后重点是串行,慌了,间接反应式地答复,没有去剖析如何实现串行,间接说了async await,后果就无法挽回了
- 完结面试之后,本人尝试实现,发现自己须要重复调试能力写对,所以侧面放映出这方面的常识,灵便应用能力不算特地好
后记
这道题做错了,第一面就挂了,持续加油吧。当然我晓得不只是这道题谬误导致面试失败的。除了加油还能怎么样呢?哈哈。