关于面试:字节真题用js实现串行操作

39次阅读

共计 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)
    })
}

题目剖析

  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. 完结面试之后,本人尝试实现,发现自己须要重复调试能力写对,所以侧面放映出这方面的常识,灵便应用能力不算特地好

后记

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

正文完
 0