Làm cách nào để sử dụng không đồng bộ GM_xmlhttpRequest để trả về các giá trị theo thứ tự ban đầu?
Tôi đang cố tạo tập lệnh Tampermonkey để cập nhật ngày tháng trên một số trang web. Tôi nhận được một mảng id từ một trang web và tôi đang yêu cầu dữ liệu từ nó với id của mảng. Sau đó, tôi phải trả lại dữ liệu của từng Đầu vào.
Như chức năng này async
, nó trả về dữ liệu theo thứ tự ngẫu nhiên, nhưng tôi cần những mảng mới đó trả về theo thứ tự ban đầu. Tôi đã thử đồng bộ hóa và Promise
s, nhưng cái đầu tiên quá chậm và tôi không hiểu cái thứ hai.
Tôi có thể sắp xếp id, nhưng tôi cũng nhận được ngày tháng theo thứ tự của Mảng đầu tiên, vì vậy tôi không biết làm thế nào để đạt được thứ tự giống như mảng id thứ hai.
Đây là mã:
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);
}
Trả lời
Bạn có thể sử dụng Lời hứa để thực hiện các GET
yêu cầu theo một thứ tự cụ thể. Đây là một ví dụ:
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);
}
}
Trong ví dụ này, tôi đã tạo một makeGetRequest()
hàm với trả về một lời hứa, được giải quyết khi GET thành công, nhưng bị từ chối khi thất bại.
await
đợi Lời hứa kết thúc trước khi tiếp tục và try
tồn tại để bắt lời từ chối Lời hứa (nếu GET không thành công).
Người giới thiệu:
- Promisetrên MDN .
- awaittrên MDN .