Как вернуть значения из функции?

Обсуждение и помощь по вопросам взаимодействия с ВКонтакте API в IFrame-приложениях (JavaScript, PHP и т.д)
Ответить
PATCH
Сообщения: 5
Зарегистрирован: 15 июл 2013, 07:46

Как вернуть значения из функции?

Сообщение PATCH »

Код: Выделить всё

<html> <head>   <title>Заголовок страницы</title>  <script type='text/javascript' src='http://vk.com/js/api/xd_connection.js?2'></script> </head> <body><script>function js_vk_init () { return VK.api("friends.getAppUsers",{},function(data){ arr =data.response ; str=arr.length; return str.ToString});   } </script><input type="button" onclick="alert(js_vk_init())" value="GO"/> </body></html>
собствено вопрос как вернуть значение из вложеной функции? при

Код: Выделить всё

 function js_vk_init () { VK.api("friends.getAppUsers",{},function(data){ arr =data.response ; str=arr.length; alert( str.ToString);});
все идеально выводит, но мне нужно вернуть полученое значение ввиде строки или числа (по сути в переменой число) когда я использую самый первый код - выводит undefined - что посути означает значение отсутствует)
XELAD
Сообщения: 205
Зарегистрирован: 17 июл 2012, 05:25

Re: Как вернуть значения из функции?

Сообщение XELAD »

Мне кажется, или данная вложенная функция - это функция при успешном выполнении запроса к вк апи? Запрос выполнен, запускается эта функция, и тут она пытается return какое-то значение, хотя её никто не просил. Да и кому она это значение Return?
PATCH
Сообщения: 5
Зарегистрирован: 15 июл 2013, 07:46

Re: Как вернуть значения из функции?

Сообщение PATCH »

а как ее попросить вернутся?)) сосбтвено функция вызывается и получает ответ > onclick="alert(js_vk_init())" и выводится сообщение ответа
sasha^
Сообщения: 711
Зарегистрирован: 10 сен 2012, 16:52

Re: Как вернуть значения из функции?

Сообщение sasha^ »

вы просто неправильно понимаете принцип запроса...
в функции api передается аргумент-функция (безимянная), которая при успешном выполнении выполняет инструкции...
и к тому-же, мы не знаем когда выполнится эта функция - через 1мс или через 1с(если инет тупой, или комп затупил вдруг)..

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

Код: Выделить всё

<html> <head>  <title>Заголовок страницы</title>  <script type='text/javascript' src='http://vk.com/js/api/xd_connection.js?2'></script> </head> <body><script>var x; // глобальная переменнаяfunction js_vk_init () { return VK.api("friends.getAppUsers",{},function(data){ arr =data.response ; str=arr.length; x = str.ToString; do_something(); // хотя вызвать потом можно где-угодно, да еще и глобальная переменная у нас есть, значит значение х не потеряется});   }function do_something() { alert(x);}</script><input type="button" onclick="js_vk_init()" value="GO"/> </body></html>
или взять в той функции(если значение больше нигде не нужно, и нужно его обработать всего 1 раз) что-то сделать и все..

Код: Выделить всё

<html> <head>  <title>Заголовок страницы</title>  <script type='text/javascript' src='http://vk.com/js/api/xd_connection.js?2'></script> </head> <body><script>// просто делаем что-то при получении...function js_vk_init () { return VK.api("friends.getAppUsers",{},function(data){ arr =data.response ; str=arr.length; var x = str.ToString; alert(x);});   }</script><input type="button" onclick="js_vk_init()" value="GO"/> </body></html>
P.S. дополнительный материал:)
функция VK.api() - событийная.. она вызывает безымянную функцию(в данном случае) при наступлении события о завершении запроса.. потому и она вернуть значение не может!
вот пример, как работать может это:

Код: Выделить всё

function api(func) {//тут что-то делается..func(result); // тут вызывается безымянная функция с параметром result( результат прошлых вычислений..)}api(function(data){//тут что-то делается});
из примера видно как это работает...
правильное название - функциональный литерал))
например такой код совершенно правильный:

Код: Выделить всё

var test = function(a,b){return a+b;}test(1,2);//будет 3=)
P.S.S. удачи!
Ответить