Javascript Can';t从响应的结束事件中递归调用Http.Request

Javascript Can';t从响应的结束事件中递归调用Http.Request,javascript,node.js,asynchronous,recursion,Javascript,Node.js,Asynchronous,Recursion,我想发出一个HTTP GET请求,然后在最后一个请求完成后立即触发另一个请求。每个请求几乎相同(对路径的微小更改) 我很难理解以下内容不起作用的原因(简化版): 我知道有很多库等用于对异步代码进行排序,但我真的很想理解为什么我不能用这种方式实现异步循环。req.end()完成请求。直到您完成请求,才会开始响应。因此req.end()内部res.on('end',function(){})没有任何意义 如果要使用其他路径发出另一个请求,可以执行以下操作: var http = require('h

我想发出一个HTTP GET请求,然后在最后一个请求完成后立即触发另一个请求。每个请求几乎相同(对路径的微小更改)

我很难理解以下内容不起作用的原因(简化版):

我知道有很多库等用于对异步代码进行排序,但我真的很想理解为什么我不能用这种方式实现异步循环。

req.end()
完成请求。直到您完成请求,才会开始响应。因此
req.end()
内部
res.on('end',function(){})
没有任何意义

如果要使用其他路径发出另一个请求,可以执行以下操作:

var http = require('http');
var options = { ... } // host, port etc

makeRequest(options, function() {
  db.insert(data);
  options.path = somewhat_new_path;
  makeRequest(options, function() { //this will make a recursive synchronous call
    db.insert(data);
  });
});

options.path = another_path;
makeRequest(options, function() {  //this will make a asynchronous call
  db.insert(data);
});

var makeRequest = function(options, callback) {
  http.request(options, function(res) {
    res.on('data', function(chunk) {
      data+=chunk;
    });

    res.on('end', callback);
  }).end();
}

你想知道为什么
req.end()
inside
res.on
不起作用?我知道req.end()完成了请求,但我首先在外部调用它-因此请求被触发。然后,当响应的结束事件被触发时,我只想再次调用它。你能更详细地解释一下为什么那不起作用吗?@DanielC是的,它是在外面触发的。但同一请求不能触发两次。您必须发出另一个
http.request
。好的。谢谢现在我明白了,我必须将它包装在一个函数中,并将其作为回调传递。
var http = require('http');
var options = { ... } // host, port etc

makeRequest(options, function() {
  db.insert(data);
  options.path = somewhat_new_path;
  makeRequest(options, function() { //this will make a recursive synchronous call
    db.insert(data);
  });
});

options.path = another_path;
makeRequest(options, function() {  //this will make a asynchronous call
  db.insert(data);
});

var makeRequest = function(options, callback) {
  http.request(options, function(res) {
    res.on('data', function(chunk) {
      data+=chunk;
    });

    res.on('end', callback);
  }).end();
}