Область видимости переменной
Почему не записывает данные в переменную data в success?
Внутри этой функции все ок, но SomeClass.prototype.foo = function(id){ var data = false; ajax({ method: 'POST', url: 'test.php', params: 'id='+id, success: function(response){ data = response; // ответ получен } }); return data; } пробовал и так: var data = function(response){ return response; } ajax({ method: 'POST', url: 'test.php', params: 'id='+id, success: data }); return data(); Но это работает function foo(obj){ obj.test('Hello, World'); } function bar(){ var data; foo({ test: function(response){ data = response; } }) return data; } console.log(bar()); //hello world Извиняюсь, спойлера не нашел, поэтому скидываю (на всякий случай) обертку для Ajax. function ajax(setting){ setting.method = setting.method === undefined ? 'GET' : setting.method; setting.params = setting.params === undefined ? null : setting.params; if (setting.url === undefined || typeof setting.success !== 'function' || (setting.method === 'POST' && setting.params === null)) return false; var xmlhttp, send = setting.method === 'GET' ? null : setting.params, url = setting.method === 'GET' ? setting.url + setting.params : setting.url; try{ xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e){ try { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); } catch (E) { xmlhttp = false; } } if (!xmlhttp && typeof XMLHttpRequest !== 'undefined'){ xmlhttp = new XMLHttpRequest(); } xmlhttp.open(setting.method, url, true); if (setting.method === 'POST'){ xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded') } xmlhttp.onreadystatechange = function(){ if (xmlhttp.readyState == 4){ if (xmlhttp.status == 200){ setting.success(xmlhttp.responseText); } } } xmlhttp.send(send); } Вопрос возможно банальный, но... |
Цитата:
|
Safort, спасибо, запомнил;)
Но, как я понял, синхронный запрос не рекомендуется использовать, как быть? Возможно есть какие-то обходы? |
Lemme, не обращай на него внимания, это местный цепной тролль)
С асинхронными функциями в JS работают с помощью коллбеков (система замыканий тут очень в тему): SomeClass.prototype.foo = function(id, onSuccess) { ajax({ method: 'POST', url: 'test.php', params: 'id='+id, success: onSuccess }); } var instance = new SomeClass(); instance.foo(10, function(response) { console.log(response); }); Если хочешь упрощения кода - посмотри в сторону Promise из ES6 (это новейшая спецификация языка, только месяц назад релизнулась), с ними код будет выглядить так: SomeClass.prototype.foo = function(id) { return ajax({ method: 'POST', url: 'test.php', params: 'id=' + id, success: onSuccess }); } var instance = new SomeClass(); instance.foo(10).then(function(response) { }); Промайзы доступны во всех последних браузерах, кроме IE, для него придется подключить какой-нибудь полифилл. |
Добавлю к ответу Erolast что релизация промисов есть в том же jQuery
|
Erolast, спасибо, буду разбираться с этим. А насчет этого тролля.... Я ему уже все сказал=)
Makarov, да мне это не для реального проекта, а для обучения. Соответственно, не использую никаких библиотек/фреймворков. |
Раз обучаешься - тогда и в остальные фичи ES6 углубись, там очень много вкусного, в том числе и высокоуровневый синтаксис объявления классов.
|
Erolast, ага, я уже читал о ES6, но не думал, что данная спецификация уже используется.
|
ES6 используется уже как несколько лет, сейчас просто утвердился стандарт.
|
Erolast, я в js начал углубляться совсем недавно, поэтому для меня все в новинку. Раньше использовал. jQuery и то по мелочам=)
|
Часовой пояс GMT +3, время: 01:06. |