मेरे पास इस तरह एक लूप है:

var req;

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

प्रत्येक वेबसाइट के अनुरोध के लिए कॉलबैक (handleRequest) एसिंक्रोनस रूप से चलता है।

हालांकि, हैंडल अनुरोध में एकमात्र पैरामीटर "प्रतिक्रिया" प्रतीत होता है। जब कॉलबैक चलाया जाता है, तो लूप पहले ही पूरा हो चुका होता है, तो मैं यह कैसे ट्रैक कर सकता हूं कि यह प्रतिक्रिया किस वेबसाइट के लिए है, इसलिए मैं इसे तदनुसार संभाल सकता हूं?

0
Nuno 10 अक्टूबर 2019, 19:48

1 उत्तर

सबसे बढ़िया उत्तर

आप दो पैरामीटर लेने के लिए अपना handleRequest बदल सकते हैं - url उनमें से पहला होने के नाते। उसके साथ आप आंशिक रूप से लागू कर सकते हैं। mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_objects/Function/bind#Partially_applied_functions" rel="nofollow noreferrer">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
}

आप 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))
}
1
VLAZ 10 अक्टूबर 2019, 20:35