Как я могу вернуть значение из GM_xmlhttprequest?

Вот этот код:

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

Есть идеи, что я делаю не так?


person GeoffreyF67    schedule 08.02.2009    source источник


Ответы (2)


Запрос выполняется асинхронно. Вот почему функция в первую очередь принимает onload функцию обратного вызова. Если бы это было синхронно, то GM_xmlhttpRequest просто вернул бы детали ответа, как обычная функция.

В ожидании возврата запроса код после вызова GM_xmlhttpRequest продолжает выполняться. Ваш сценарий правильно определяет, что infiltrationResult не определено, поскольку запрос еще не завершен.

Если вам нужно сделать больше, чем просто назначить переменную, когда запрос вернется, сделайте это в обратном вызове onload.

person Rob Kennedy    schedule 08.02.2009
comment
Вы были абсолютно правы. Перенос кода, который обезвредил этот результат, в функцию, все исправил. Спасибо! G-Man - person GeoffreyF67; 08.02.2009

Попробуй это:

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);
}
person DarkThanos    schedule 26.11.2010