Как я могу использовать async GM_xmlhttpRequest для возврата значений в исходном порядке?
Я пытаюсь сделать сценарий Tampermonkey для обновления дат на каком-то сайте. Я получил массив идентификаторов с сайта и запрашиваю у него данные с идентификатором массива. После этого мне нужно вернуть данные каждого входа.
Как и функция async
, она возвращает данные в случайном порядке, но мне нужно, чтобы эти новые массивы возвращались в исходном порядке. Я пробовал синхронизировать и Promise
s, но первый слишком медленный, а второй я не понял.
Я могу сортировать идентификаторы, но у меня также есть даты, которые находятся в порядке первого массива, поэтому я не знаю, как достичь того же порядка, что и второй массив идентификаторов.
Вот код:
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);
}
Ответы
Вы можете использовать Promises для выполнения 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()
функцию с возвратом обещания, которое разрешается при успешном выполнении GET, но отклоняется при неудаче.
await
ожидает выполнения обещания, прежде чем двигаться дальше, и try
существует, чтобы перехватить отклонение обещания (если GET не удается).
Рекомендации:
- Promiseна MDN .
- awaitна MDN .