题目

请实现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)    })}

题目剖析

  1. serialize入参是一个工作数组,且会返回一个done办法
  2. 输入是依据入参的工作一个一个执行,所以是串行执行
  3. 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()});        }    }}

复盘

  1. 第一遍审题的时候没有审分明,没有留意到重点是串行,认为第三点是重点
  2. 在面试官揭示做错了之后,而后重点是串行,慌了,间接反应式地答复,没有去剖析如何实现串行,间接说了async await,后果就无法挽回了
  3. 完结面试之后,本人尝试实现,发现自己须要重复调试能力写对,所以侧面放映出这方面的常识,灵便应用能力不算特地好

后记

这道题做错了,第一面就挂了,持续加油吧。当然我晓得不只是这道题谬误导致面试失败的。除了加油还能怎么样呢?哈哈。