在网上看见了一个问题,比较感兴趣,所以自己尝试写了一下。
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)
}
}
}
}
简单做了一个演示样例:(点我查看)