我正在通过 Nodeschool 参加“函数式 Javascript 研讨会”。其中一项练习的标题是“阻止事件循环”,我很难理解它。通过过去的练习,我确保真正尝试理解解决方案,这样如果我必须重做问题,我就会理解如何解决它(而不是第一次就破解它)。但这个概念确实对我来说是一个挑战。
修改样板中提供的递归重复函数,例如
它不会阻塞事件循环(即定时器和 IO 处理程序可以
火)。这必然要求重复是异步的。
超时会在 100 毫秒后排队等待触发,这将打印
测试结果并退出该过程。重复应该释放
控制事件循环以允许在所有操作完成之前超时中断。
尝试在超时触发之前执行尽可能多的操作!
样板文件
function repeat(operation, num) {
// modify this so it can be interrupted
if (num <= 0) return
operation()
return repeat(operation, --num)
}
module.exports = repeat
Solution
function repeat(operation, num) {
if (num <= 0) return
operation()
// release control every 10 or so
// iterations.
// 10 is arbitrary.
if (num % 10 === 0) {
setTimeout(function() {
repeat(operation, --num)
})
} else {
repeat(operation, --num)
}
}
module.exports = repeat
我试图更好地理解 setTimeout 并且我在某种程度上理解它是如何工作的。但我不明白问题本身的一些语言和概念:
修改样板中提供的递归重复函数,这样它就不会阻塞事件循环(即计时器和 IO 处理程序可以触发)。这必然需要重复
异步。
我不明白该解决方案使每 10 次重复都是异步的,如何防止重复阻塞事件循环。我假设事件循环和事件队列是相同的东西?例如,当 JavaScript 代码通过其代码同步运行时,点击会被放置在事件队列中,直到执行堆栈为空,然后才会查看队列。每 10 次重复异步如何防止队列被阻塞——我对“被阻塞”的理解是队列中的项目被阻塞,直到堆栈为空,此时 javascript 会查看队列中的内容。因此,假设在重复 10、20、30 等时,这段代码使这些重复异步,但它是否仍然继续遍历所有数字,直到它达到零,此时堆栈现在为空,然后 JavaScript 查看队列?那么这个解决方案如何解决像问题所问的那样的阻塞呢?
接下来,问题涉及“释放控制”。不知道这意味着什么。什么是控制?如何释放控制?释放的目的是什么?
紧接着,问题说“在所有操作完成之前允许超时中断”。中断是否意味着基本上每10次重复就被中断(直到同步代码结束才允许完成)?
最后,最后的挑战是在超时触发之前尝试执行尽可能多的操作......我也不明白这如何适用于解决方案。 setTimeout 似乎没有设定持续时间。