如何在响应回调中获取原始请求URL?

时间:2019-10-10 16:48:14

标签: node.js http https

我有这样一个循环:

var req;

for (var i=0; i<sites.length; i++) {
    req = https.get(sites[i], handleRequest);
    req.on('error', handleError);
}

对于每个请求的网站,回调(handleRequest)都是异步运行的。

但是,handleRequest中的唯一参数似乎是“响应”。 运行回调时,循环已经完成,那么如何跟踪此响应是针对哪个网站的,因此可以相应地进行处理?

1 个答案:

答案 0 :(得分:1)

您可以将handleRequest更改为两个参数-第一个是url。这样,您可以通过partially apply Function#bind来调用函数,并在调用时 set 设置url参数,但是您仍然要等待第二个参数。

let sites = [
  "https://example.com",
  "https://example.net",
  "https://example.org"
];

function handleRequest(url, res) {
  console.log("handling:", url);
  
  /* handling code */
}

//minimalistic dummy HTTP module that responds after 1 second
let https = {
  get: handler => setTimeout(handler, 1000)
}

for (var i=0; i < sites.length; i++) {
    let url = sites[i];
    https.get(handleRequest.bind(this, url)) //partially apply handleRequest
}

您可以通过currying得到类似的结果-而不是拥有两个参数,首先要获取一个参数,然后返回要获取另一个参数的函数。调用时,它导致(我认为)更好的语法:

let sites = [
  "https://example.com",
  "https://example.net",
  "https://example.org"
];

function handleRequest(url) {
  return function actualHandler(res) {
    console.log("handling:", url);
  
    /* handling code */
  }
}

//minimalistic dummy HTTP module that responds after 1 second
let https = {
  get: handler => setTimeout(handler, 1000)
}

for (var i=0; i < sites.length; i++) {
    let url = sites[i];
    https.get(handleRequest(url))
}