मैं मूल क्रम में मान वापस करने के लिए async GM_xmlhttpRequest का उपयोग कैसे कर सकता हूं?

Jan 03 2021

मैं किसी साइट पर दिनांक अद्यतन करने के लिए एक Tampermonkey स्क्रिप्ट बनाने का प्रयास कर रहा हूं। मुझे साइट से आईडी की एक सरणी मिली है, और मैं सरणी की आईडी के साथ डेटा का अनुरोध कर रहा हूं। उसके बाद, मुझे प्रत्येक इनपुट का डेटा वापस करना होगा।

जैसा कि फ़ंक्शन है async, यह एक यादृच्छिक क्रम में डेटा देता है, लेकिन मुझे मूल क्रम में लौटने के लिए उन नए सरणियों की आवश्यकता है। मैंने सिंक और Promiseएस की कोशिश की है , लेकिन पहला बहुत धीमा है और मुझे दूसरा समझ में नहीं आया है।

मैं आईडी को सॉर्ट कर सकता हूं, लेकिन मुझे पहले ऐरे के क्रम में तारीखें भी मिलीं, इसलिए मुझे नहीं पता कि दूसरी आईडी सरणी के समान ऑर्डर कैसे प्राप्त किया जाए।

यहाँ कोड है:

id = GM_getValue('id');

for (let i = 0; i < id.length; i++) {
  setTimeout(() => {
      console.log("Updating " + (i + 1) + " Title");

      GM_xmlhttpRequest({
          method: "GET",
          url: "***" + id[i] + "/***",
          onload: function(response) {
            $(response.responseText).find("#main-form :input").each(function(x) { if (x == 0) ids.push(parseInt($(this).val()));
                if (x == 1) array.push($(this).val()));
            });
        }
      });
  }, i * 333);
}

जवाब

double-beep Jan 04 2021 at 18:01

आप GETकिसी विशिष्ट क्रम में अनुरोधों को निष्पादित करने के लिए वादे का उपयोग कर सकते हैं । यहाँ एक उदाहरण है:

id = GM_getValue('id');

function makeGetRequest(url) {
  return new Promise((resolve, reject) => {
    GM_xmlhttpRequest({
      method: "GET",
      url: url,
      onload: function(response) {
        resolve(response.responseText);
      },
      onerror: function(error) {
        reject(error);
      }
    });
  });
}

for (let i = 0; i < id.length; i++) {
  console.log("Updating " + (i + 1) + " Title");
  try {
    const response = await makeGetRequest("***" + id[i] + "/***");
    $(response).find("#main-form :input").each(function(x) { if (x == 0) ids.push(parseInt($(this).val()));
      if (x == 1) array.push($(this).val());
    });
  } catch (error) { // in case the GET request fails
    console.error("Request failed with error code", error.status, ". Message is ", error.responseText);
  }
}

इस उदाहरण में, मैंने makeGetRequest()एक वादा रिटर्न के साथ एक फ़ंक्शन बनाया है , जिसे सफलता प्राप्त करने पर हल किया जाता है , लेकिन विफलता पर खारिज कर दिया जाता है।

awaitआगे बढ़ने से पहले वादे के निपटारे की प्रतीक्षा करता है और tryवादा अस्वीकृति को पकड़ने के लिए मौजूद है (यदि जीईटी विफल हो जाता है)।

सन्दर्भ:

  • Promiseएमडीएन पर ।
  • awaitएमडीएन पर ।