共计 1025 个字符,预计需要花费 3 分钟才能阅读完成。
题目
请实现 serialize 办法
serialize([log(1),
log(2),
sleep(3),
log(4)
]).done(() => {console.log('done')
})
// 输入:1 2 3 4 done
function 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,后果就无法挽回了
- 完结面试之后,本人尝试实现,发现自己须要重复调试能力写对,所以侧面放映出这方面的常识,灵便应用能力不算特地好
后记
这道题做错了,第一面就挂了,持续加油吧。当然我晓得不只是这道题谬误导致面试失败的。除了加油还能怎么样呢?哈哈。
正文完