Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Имеет ли значение асинхронность для возврата значения, если да - то как решить вопрос (https://javascript.ru/forum/misc/49712-imeet-li-znachenie-asinkhronnost-dlya-vozvrata-znacheniya-esli-da-kak-reshit-vopros.html)

Aetae 26.08.2014 04:59

Цитата:

Сообщение от antananarivu (Сообщение 327449)
Вы могли бы поправить мой код, так чтобы в var myVar поместился финальный результат выполнения функции submitForm();

Нет.


function createInstance() {
    var req = null;
    if (window.XMLHttpRequest) {
        req = new XMLHttpRequest();
    } else if (window.ActiveXObject) {
        try {
            req = new ActiveXObject("Msxml2.XMLHTTP");
        } catch (e) {
            try {
                req = new ActiveXObject("Microsoft.XMLHTTP");
            } catch (e) {
                alert("XHR not created");
            }
        }
    }
    return req;
}

function submitForm(callback) {
    var req = createInstance();
    req.onreadystatechange = function() {
        if (req.readyState == 4) {
            if (req.status == 200) {
                var but = req.responseText;
                callback(but);
            } else {
                alert("Error: returned status code " + req.status + " " + req.statusText);
            }
        }
    };
    req.open("GET", "op21.php", true);
    req.send(null);
}

submitForm(callback);

function callback(myVar) {
    console.log(myVar);
}

antananarivu 26.08.2014 10:33

Спасибо. Я видел это единственное решение, когда искал информацию по вопросу. А так получается, что все операции с myVar можно проводить только внутри function callback. По сути, точно также я мог быть продолжать проводить операции с переменной but внутри функции submitForm продолжая блок после if (req.status == 200)

Мне нужен результат выполнения функции submitForm использовать в других местах страницы в ряде других функций, собственно говоря поэтому я и хотел поместить результат в новую переменную, чтобы потом с ней работать.

Aetae 26.08.2014 11:12

Ну раз ты это понял, то теперь можно и открыть тебе грязную сторону javascript, о которой не принято говорить.
Если ты сделаешь так:
req.open("GET", "op21.php", false);
то запрос будет синхронным и страница намертво зависнет до тех пор пока не загрузится ответ от сервера, после чего продолжит выполнение кода. Таким образом можно быть уверенным, что данные в переменной будут на месте.

Помни: в приличном обществе за такой подход плюют в лицо.


Часовой пояс GMT +3, время: 17:14.