Как я могу вернуть значение из gm_xmlhttprequest?
-
22-08-2019 - |
Вопрос
У меня есть этот код здесь:
var infiltrationResult;
while(thisOption) {
var trNode = document.createElement('tr');
var tdNode = document.createElement('td');
var hrefNode = document.createElement('a');
infPlanetID = thisOption.getAttribute('value');
var myURL = "http://www.hyperiums.com/servlet/Planetinf?securitylevel=90&newinfiltr=New+infiltration&planetid=" + PlanetID + "&infplanetid=" + infPlanetID;
GM_xmlhttpRequest({
method: 'GET',
url: myURL,
headers: {
'User-agent': 'Mozilla/4.0 (compatible) Greasemonkey',
'Accept': 'application/atom+xml,application/xml,text/xml',
},
onload: function(responseDetails) {
if (responseDetails.responseText.match(/<b>Invalid order<\/td><\/tr><tr><td><BR><center><font color=#AAAA77 face=verdana,arial size=2>The target planet is blocking all infiltrations[\s\S]<BR><BR>/im)) {
// Successful match
infiltrationResult = 'Invalid Order';
} else {
// Match attempt failed
infiltrationResult = 'Infiltration Successfully Created';
}
}
});
Когда я добавляю
бдительность (InfiltrationResult);
Сразу после того, как он назначен, я правильно вижу строку.
Однако после выхода функции я попробовал то же самое и получаю:
undefined
Есть идеи, что я делаю не так?
Решение
Запрос работает асинхронно. Это Почему Функция принимает onload
Функция обратного вызовов в первую очередь. Если это было синхронно, то GM_xmlhttpRequest
просто вернет детали ответа как обычная функция.
В ожидании возврата запроса код после вызова GM_xmlhttpRequest
продолжает работать. Ваш сценарий правильно идентифицирует, что infiltrationResult
не определен, потому что запрос еще не завершен.
Если вам нужно сделать больше, чем просто назначить переменную, когда запрос возвращается, сделайте это в onload
перезвонить.
Другие советы
Попробуй это:
var infiltrationResult;
while(thisOption) {
var trNode = document.createElement('tr');
var tdNode = document.createElement('td');
var hrefNode = document.createElement('a');
infPlanetID = thisOption.getAttribute('value');
var myURL = "http://www.hyperiums.com/servlet/Planetinf?securitylevel=90&newinfiltr=New+infiltration&planetid=" + PlanetID + "&infplanetid=" + infPlanetID;
GM_xmlhttpRequest({
method: 'GET',
url: myURL,
headers: {
'User-agent': 'Mozilla/4.0 (compatible) Greasemonkey',
'Accept': 'application/atom+xml,application/xml,text/xml',
},
onload: function(responseDetails) {
if (responseDetails.responseText.match(/<b>Invalid order<\/td><\/tr><tr><td><BR><center><font color=#AAAA77 face=verdana,arial size=2>The target planet is blocking all infiltrations[\s\S]<BR><BR>/im)) {
// Successful match
infiltrationResult = 'Invalid Order';
} else {
// Match attempt failed
infiltrationResult = 'Infiltration Successfully Created';
}
sentback(infiltrationResult);//Sent it when it loads only
}
});
function sentback(x){
alert(x);
}