我有这样一个循环:
var req;
for (var i=0; i<sites.length; i++) {
req = https.get(sites[i], handleRequest);
req.on('error', handleError);
}
对于每个请求的网站,回调(handleRequest
)都是异步运行的。
但是,handleRequest中的唯一参数似乎是“响应”。 运行回调时,循环已经完成,那么如何跟踪此响应是针对哪个网站的,因此可以相应地进行处理?
答案 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))
}