node.js - Nodejs事件循环,如何正确使用nextTick

标签 node.js asynchronous event-loop

我正在尝试遵循[ Node 学校][1]的练习。有一项练习需要收集三个流,并且仅在所有三个流完成后才打印输出。不使用任何第三方模块。

有人可以指出为什么我的方法不起作用吗?它陷入了无限循环:

var http = require('http');
var concat = require('concat-stream');

var count = 3;
var str1, str2, str3;

http.get(process.argv[2], function (response) {
  response.pipe(concat(function(data) {    
  str1 = data.toString();
  --count;
  }));
});

http.get(process.argv[3], function (response) {
  response.pipe(concat(function(data) {    
    str2 = data.toString();
    --count;
  }));
});

http.get(process.argv[4], function (response) {
  response.pipe(concat(function(data) {    
    str3 = data.toString();
    --count;
  }));
});

function foo() {
  if (count > 0) {     
    process.nextTick(foo);    
  } else {
     console.log(str1);
     console.log(str2);
     console.log(str3);
  }
};

foo();

最佳答案

http.get() 回调在事件循环的下一个刻度或更晚之前无法运行。 process.nextTick() 在事件循环的前面放置一些东西,在已经存在的回调之前。

您的递归例程永远不会停止递归,因为它正在等待这些回调来递减计数器,但它们永远不会触发。

如果将 process.nextTick() 替换为 setImmediate(),它可能会起作用。 (我没有测试过,如果你这样做了,嘿,请告诉我它是否有效。)

但我想说的是完全摆脱递归。不需要。你可以(例如)做这样的事情:

var count = 0;

var httpGet = function (index) {
  http.get(process.argv[2 + index], function (response) {

      // Do stuff here

      // This next bit will probably end up inside the callback provided to concat
      count++;
      if (count === 3) {
        // Print results here
      }
  })
};

for (var i = 0; i < 3; i++) {
  httpGet(i);
}

关于node.js - Nodejs事件循环,如何正确使用nextTick,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30515037/

相关文章:

java - 在@SpringBootTest中测试@Async注释的方法

php - RatchetPHP 无法向循环中的所有客户端发送消息

ajax - 为什么需要异步请求的事件循环(例如,AJAX 长轮询)

node.js - Socket.io 通过 XHR-Polling 不传递 cookie

javascript - 无法读取未定义的属性 'use'

javascript - 如何在存储到数组中的 forEach 中返回响应/ promise ?

ajax - 如何处理乱序的 Ajax 请求?

Python,调用进程池而不阻塞事件循环

mysql - 环回+连接多个数据库

javascript - Socket.IO - 如何替换客户端上的事件监听器