以下为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