Değerleri orijinal sırada döndürmek için async GM_xmlhttpRequest'i nasıl kullanabilirim?

Jan 03 2021

Bazı sitelerde tarihleri ​​​​güncellemek için bir Tampermonkey betiği yapmaya çalışıyorum. Bir siteden bir dizi kimlik aldım ve ondan dizinin kimliğiyle veri istiyorum. Bundan sonra, her Girişin verilerini döndürmem gerekiyor.

İşlev olduğu gibi async, verileri rastgele bir sırayla döndürür, ancak bu yeni dizilerin orijinal sırayla dönmesine ihtiyacım var. Senkronizasyon ve Promises'yi denedim , ancak ilki çok yavaş ve ikincisini anlamadım.

Kimlikleri sıralayabilirim, ancak ilk Dizinin sırasına göre olan tarihleri ​​de aldım, bu yüzden ikinci kimlik dizisiyle aynı sırayı nasıl elde edeceğimi bilmiyorum.

İşte kod:

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);
}

Yanıtlar

double-beep Jan 04 2021 at 18:01

GETİstekleri belirli bir sırayla yürütmek için Sözler'i kullanabilirsiniz . İşte bir örnek:

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);
  }
}

Bu örnekte, GET başarısında çözümlenen , ancak başarısızlık durumunda reddedilenmakeGetRequest() bir söz döndüren bir işlev oluşturdum .

awaitDevam etmeden önce Sözün yerleşmesini ve tryVarlığın Sözün reddedilmesini yakalamak için (GET başarısız olursa) bekler .

Referanslar:

  • PromiseMDN'de .
  • awaitMDN'de .