Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/416.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 阻塞事件循环_Javascript_Asynchronous_Functional Programming - Fatal编程技术网

Javascript 阻塞事件循环

Javascript 阻塞事件循环,javascript,asynchronous,functional-programming,Javascript,Asynchronous,Functional Programming,我将通过Nodeschool参加“功能Javascript研讨会”。其中一个练习题为“阻塞事件循环”,我很难理解它。在过去的练习中,我确保真正尝试理解解决方案,这样,如果我不得不重做问题,我就会理解如何解决它(而不是第一次就把它砍掉)。但是这个概念确实对我有挑战性 修改样板文件中提供的递归重复函数,例如 它不会阻塞事件循环(即计时器和IO处理程序可以 火)。这必然要求repeat是异步的 在100毫秒后,超时将排队触发,这将打印 测试结果并退出流程。重复应该释放 控制事件循环,以允许超时在所有操

我将通过Nodeschool参加“功能Javascript研讨会”。其中一个练习题为“阻塞事件循环”,我很难理解它。在过去的练习中,我确保真正尝试理解解决方案,这样,如果我不得不重做问题,我就会理解如何解决它(而不是第一次就把它砍掉)。但是这个概念确实对我有挑战性

修改样板文件中提供的递归重复函数,例如 它不会阻塞事件循环(即计时器和IO处理程序可以 火)。这必然要求repeat是异步的

在100毫秒后,超时将排队触发,这将打印 测试结果并退出流程。重复应该释放 控制事件循环,以允许超时在所有操作完成之前中断

在超时触发之前,尝试执行尽可能多的操作

样板

函数重复(操作,num){
//对此进行修改,以便可以中断
如果(num消息队列(您称之为事件队列)是要处理的
消息的列表

事件循环逐个处理这些消息,直到完成

您发布的repeat函数的阻塞版本将是

function repeat(operation, num) {
    if (num <= 0) return

    operation()

    repeat(operation, --num)
}
函数重复(操作,num){

如果(num您似乎每10次重复一次就被困在这个
上,这让我觉得您可能是从错误的角度来处理这个问题的perspective@JaromandaX我每10次重复引用一次主要是为了标记setTimeout函数在解决方案中的运行位置不重要——可以是任何数字。无论如何,我希望能被引导到一个正确的角度。我的目标是真正理解这个问题背后的概念,这样我就能够自己回答它。我的观点是,我相信你是以错误的方式来解决问题的。我可能(可能)错。我的观察可能是为了让你退后一步,重新评估问题,但是,再看看这个问题,我发现
解决方案
不是你的解决方案,你很难理解它。
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
function repeat(operation, num) {
    if (num <= 0) return

    operation()

    repeat(operation, --num)
}
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)
    }
}