输出异步结果

​ 在网上看见了一个问题,比较感兴趣,所以自己尝试写了一下。

​ 这个是 原题目网址 与对应的 API

​ API 调用样例:

const i = 1
xss_rpc_call(i, function (res) {
  console.log(i, res)
})
// 0x1

​ 递归解法:

function recursiveFunc(i) {
  // 递归边界条件
  if (i > 31) {
    return
  }
  // 递归
  xss_rpc_call2(i, function (res) {
    recursiveFunc(i + 1)
    console.log(i, res)
  })
}

​ 题目的要求通过调用 xss_rpc_call2 的方式输出异步请求的 16 进制结果,考虑到由于 API 返回的数据有一个随机延迟,所以保证输出顺序的同时,应当尽快输出:

// 初始化输出队列与输出函数
const sequence = new Array(31).fill(null)
const outputSeq = initOutput()

function asapOutput() {
  // 循环调用 API,将结果存入输出队列
  for (let i = 0; i < sequence.length; i++) {
    xss_rpc_call2(i, function (res) {
      sequence[i] = res
      outputSeq(i)
    })
  }
  console.log(sequence)
}
function initOutput() {
  // 下一个应该输出值的索引
  let i = 0
  return function (currentIndex) {
    // 当前调用输出函数的元素索引大于下一个输出值的索引,不应输出,early return
    if (currentIndex > i) {
      return
    }
    // 从下一个该输出的结果开始顺序输出,否则更新下一个该输出的元素索引
    for (let j = currentIndex; j < sequence.length; j++) {
      const element = sequence[j]
      if (element === null) {
        i = j
        return
      } else {
        console.log(j, element)
      }
    }
  }
}


​ 简单做了一个演示样例:(点我查看

滚动至顶部