Как я могу получить исходный URL-адрес запроса в ответном обратном вызове? - PullRequest
0 голосов
/ 10 октября 2019

У меня есть такой цикл:

var req;

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

Обратный вызов (handleRequest) выполняется асинхронно для каждого запрашиваемого веб-сайта.

Тем не менее, единственный параметр в handleRequest кажетсябыть "ответом". Когда обратный вызов запущен, цикл уже завершен, так как я могу отслеживать, для какого веб-сайта этот ответ, чтобы я мог обработать его соответственно?

1 Ответ

1 голос
/ 10 октября 2019

Вы можете изменить handleRequest на два параметра - url, являющийся первым из них. При этом вы можете частично применить функцию через Function#bind и так установить параметр 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
}

Аналогичный результат можно получить с помощью curry - вместо двух параметров сначала взять один, а затем вернуть функцию, которая принимает другой. Это приводит (на мой взгляд) к лучшему синтаксису при вызове:

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))
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...