Имеет ли значение асинхронность для возврата значения, если да - то как решить вопрос
Новичок, столкнулся с проблемой, не получается поместить результат выполнения функции в переменную. Не могу понять - это проблема моего синтаксиса (но ошибок не выдает) или какие-то заморочки конкретно языка. Код следующий
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() { var req = createInstance(); req.onreadystatechange = function() { if(req.readyState == 4) { if(req.status == 200) { var but = req.responseText; // console.log(but); return but; } else { alert("Error: returned status code " + req.status + " " + req.statusText); } } }; req.open("GET", "op21.php", true); req.send(null); } var myVar= submitForm(); console.log(myVar); в результате - undefined |
Цитата:
|
подскажите, пожалуйста, каким образом решить проблему, если выполнять функцию отдельно без помещения ее результата в новую переменную - все выполняется.
|
Цитата:
Работа с асинхроннотью основана на колбэках. Выполнился асинхронный вызов - запустил колбэк функцию которой передал результат итд. |
Цитата:
А то я чисто теоретически понимаю что и как, а вот как получить результат "с асинхронностью" - не могу написать через код. Я написал, что новичок. В коде вместо op21.php можно подставить свой урл обработки асинхронного вызова - не суть важно. |
повторенье - му
часто задаваемые вопросы кто-нибудь читает? нет, потому что их много Цитата:
Цитата:
ответ приходит куда? следовательно, где его нужно использовать? а если он куда-то не приходит, нужно ли его там использовать? будет ли от него там польза? |
Называется спросил на свою голову. Вместо того, чтобы элементарно объяснить в чем особенность асинхронного вызова и подсказать по коду как правильно оформить этот колбек, мне начинают рассказывать про то, что нужно чаво читать (который вместо классического вопрос - ответ является собой простыню чата) и задают типа наводящие вопросы совершенного мутного характера. Ребята, я перед тем как на форум придти гугл пошерстил, страницы посвященные аяксу прочитал. Я знаю как вернуть синхронный запрос, но в данном случае мне это не подходит. Я понимаю, что нужно вызвать обратную функцию в момент, когда в переменной появится ResponseText но я не понимаю как это оформить через код. Нужен пример. Вы тут на элементарные задачи отвечаете по пять вариантов четкого и простого кода, а тут на задачу, по которой особо и ответов не найти в гугле начинаете задавать какие-то мутные вопросы.
|
antananarivu, такую х**ню пишешь. Возвращайся к гуглению: поисковики пока на х** не шлют!;)
|
самое главное по сути ответил. Профессор, йопт, 1400 сообщений. мандаринки в магазине тоже, видимо, выбираешь по полчаса задавая наводящие глубокомысленные вопросы о методах их выращивания.
|
еще раз пишу - индивидуумы, у которых развился профессиональный кретинизм, проходите мимо. На любом форуме таких персонажей пруд пруди, не нравятся вопросы - не сидите на форумах, вас за язык никто не тянет и отвечать не заставляет. Нервируют нубские вопросы - выключите компьютер и подышите свежим воздухом, хотя бы раз в неделю и все пройдет.
|
Цитата:
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); } |
Спасибо. Я видел это единственное решение, когда искал информацию по вопросу. А так получается, что все операции с myVar можно проводить только внутри function callback. По сути, точно также я мог быть продолжать проводить операции с переменной but внутри функции submitForm продолжая блок после if (req.status == 200)
Мне нужен результат выполнения функции submitForm использовать в других местах страницы в ряде других функций, собственно говоря поэтому я и хотел поместить результат в новую переменную, чтобы потом с ней работать. |
Ну раз ты это понял, то теперь можно и открыть тебе грязную сторону javascript, о которой не принято говорить.
Если ты сделаешь так: req.open("GET", "op21.php", false);то запрос будет синхронным и страница намертво зависнет до тех пор пока не загрузится ответ от сервера, после чего продолжит выполнение кода. Таким образом можно быть уверенным, что данные в переменной будут на месте. Помни: в приличном обществе за такой подход плюют в лицо. |
Часовой пояс GMT +3, время: 08:03. |