Değerleri orijinal sırada döndürmek için async GM_xmlhttpRequest'i nasıl kullanabilirim?
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 Promise
s'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
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 .
await
Devam etmeden önce Sözün yerleşmesini ve try
Varlığın Sözün reddedilmesini yakalamak için (GET başarısız olursa) bekler .
Referanslar:
- PromiseMDN'de .
- awaitMDN'de .