Добрый день. Есть функция с ajax После вызова функции в пхп, через json должна отдаваться обратно в js переменная. Но содержимое l_res.kpparam = nullю В чем ошибка может быть? Код (Text): new Ajax.Request(g_path+c_Kp_ScriptFileName, { parameters: { '_func': 'UserDepartment', '_p_user_id': taskid }, onSuccess: function(transport) { var l_res = transport.responseText.evalJSON(); wnd_alert(l_res.kpparam); } } ) Код (Text): function UserDepartmen($p_user_id) { $con = GetConnection(); $sql = $con->prepare("select * from table where id=:userid"); $sql->execute(array(":userid" => $p_user_id)); $array = current($sql->fetchAll(PDO::FETCH_ASSOC)); return $array; echo json_encode($array); }
А вот так? Код (Text): alert(l_res[0].kpparam); А вообще, если пользуешься хромом, то открываешь в панельке разработчика вкладку Network, там смотри свой запрос. Нажми на нужную страницу и перейди по вкладке "Превью". Там можешь увидеть свой объект.
Спасибки. Получил все в js. Но теперь проблема другая. Вот тут Код (Text): onSuccess: function(transport) { var l_res = transport.responseText.evalJSON(); var newkpst=l_res['kpstatus']; } я получаю нормально переменную. А как передать переменную за функцию? За функцией newkpst все равно пустое, даже если глобальную переменную определять или через return.
потому что область видимости в js такая. Тебе нужно где-то за пределами ajax объявить Код (Text): var newkpst; А в самом запросе: Код (Text): onSuccess: function(transport) { var l_res = transport.responseText.evalJSON(); newkpst=l_res['kpstatus']; }
Да не нужно в глобальных, можно и в локальных. Ты уверен, что не присваивается? Попробуй в консоль вывести после присваивания. Код (Text): onSuccess: function(transport) { var l_res = transport.responseText.evalJSON(); newkpst=l_res['kpstatus']; console.log(newkpst); }
Если внутри функции, то присваивается А вот вне уже нет. Вот отбивка с консоли Uncaught ReferenceError: newkpst is not defined
Смотри... Код (Text): var newkpst; function requestTo() { bla-bla-bla, onSuccess: function() { var l_res = transport.responseText.evalJSON(); newkpst = l_res['kpstatus']; } } console.log(newkpst); Все должно работать. Если объявлял newkpst - она не может быть 'undefined'! она может быть равна null, чему то другому и т. д., но не 'undefined'.
Код (Text): var newkpst; new Ajax.Request(g_path+c_Task_ScriptFileName, { parameters: { '_func': 'getstatuskp', 'tsk_id': _id.value }, onSuccess : function(transport) { var l_res = transport.responseText.evalJSON(); var newkpst=l_res['kpstatus']; transport.responseText.evalJSON(); console.log(newkpst); // Здесь пишет значение } } ); console.log(newkpst); // а здесь уже undefined
Код (Text): var newkpst; new Ajax.Request(g_path+c_Task_ScriptFileName, { parameters: { '_func': 'getstatuskp', 'tsk_id': _id.value }, onSuccess: function(transport) { var l_res = transport.responseText.evalJSON(); newkpst = l_res['kpstatus']; } }); console.log(newkpst);
Тема перемещена в JavaScript & AJAX Добавлено спустя 5 минут 53 секунды: помоему вы оба тупите. запрос асинхронный! проверьте что раньше выполняется: console.log() или onSuccess()
А если вот так... Код (Text): var newkpst; new Ajax.Request(g_path+c_Task_ScriptFileName, { parameters: { '_func': 'getstatuskp', 'tsk_id': _id.value }, onSuccess: function(transport) { var l_res = transport.responseText.evalJSON(); newkpst = l_res['kpstatus']; } }); function out() { console.log(newkpst); } var timeout = window.setTimeout(out, 5000); Добавлено спустя 4 минуты 33 секунды: Я ни туплю... Я знаю фсе сам...
Задержку из-за асинхронного вызова? Так я понимаю? Все равно сначала undefined Uncaught ReferenceError: newkpst is not defined out а как тогда эту задержку сделать?
Да не нужно делать задержку. Нужно просто как-то грамотно расставить все действия, чтобы прослеживалась очередность событий. Задержку я там вставил лишь для того, чтобы попробовать убедиться, что ход мыслей верен. У тебя есть событие onSuccess, которое выполняется после удачного запроса, вот там по идее и нужно делать дальнейшие действия (вызвать функцию, например).
Да я тоже так подумал. Но после ajax много чего понаписано. Если все остальные действия по функциям отдельным раскидать, то наверное можно будет их с тела вызывать поочередно. Только возможно, функции вызывать последовательно? Т.е. дожидаясь пока отработает одня, и только потом вторая7
Если ты после отработки запроса делаешь что-то из анимаций, то ты можешь, конечно сделать так, чтобы твои функции выполнялись последовательно. Но это опять таки делается с помощью задержек (т. е. если скажем анимация длится 200 мс, то делаешь задержку 200мс после которой выполняешь следующую функцию). Если же ты точно не знаешь сколько по времени должна выполняться твоя функция, то с задержками трюк не прокатит.