以下为ChatGPT自动生成的解答,正确与否请自行判断。
BFE.devAI解答 - JavaScript 代码题
54. 扁平化Thunk
解题思路:
扁平化Thunk意味着将所有嵌套的thunk串联起来,可以理解为将所有的异步操作按顺序执行,并将结果传递给最后一个回调函数。在处理嵌套thunk的过程中,如果有一个thunk发生错误,则需要跳过后续的所有thunk。可以采用递归的方式来处理。
具体实现:
首先定义flattenThunk函数,接收一个thunk作为参数,并返回一个新的函数,该函数内部接收一个回调函数。
调用flattenThunk返回的函数时,触发thunk,传入一个新的接受Error和result的回调函数。
判断result是否是一个thunk,如果是,则递归调用flattenThunk,将新的回调函数作为参数传入。
否则,直接触发回调函数,将error和result作为参数传入。
如果发现有错误,则直接调用最终回调函数,将错误作为参数传入,不再执行后续操作。
完整代码如下:
function flattenThunk(thunk) {
return function(done) {
function handleResult(err, data) {
if (err) return done(err)
if (typeof data === 'function') {
// 递归调用
data(handleResult)
} else {
done(null, data)
}
}
thunk(handleResult)
}
}
测试:
const func1 = (cb) => {
setTimeout(() => cb(null, 'ok'), 10)
}
const func2 = (cb) => {
setTimeout(() => cb(null, func1), 10)
}
const func3 = (cb) => {
setTimeout(() => cb(null, func2), 10)
}
flattenThunk(func3)((error, data) => {
console.log(data) // 'ok'
})
输出结果:
ok