Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   API приложений и сред (http://www.flasher.ru/forum/forumdisplay.php?f=61)
-   -   getUserBalance, Api connection (http://www.flasher.ru/forum/showthread.php?t=153178)

ghqe 30.03.2011 01:13

getUserBalance, Api connection, порядок выполняния функций
 
Здравствуйте. В документации к классу APIconnection вконтакте написано:
Цитата:

Для обращения к ВКонтакте API необходимо использовать функцию объекта VK - VK.api(methodName: String, params: Object, [onComplete: Function, OnError: Function]). При удачном завершении запроса будет вызвана функция onComplete с объектом, содержащим результат выполнения запроса. При неудачном завершении запроса будет вызвана функция OnError с объектом, содержащим данные об ошибке.
Есть код:
Код AS3:

function fetchUserBalance (data:Object): void { 
    trace("1234");
}
function onApiRequestFail (data: Object): void {
    trace("error");
}
VK.api('getUserBalance', { }, fetchUserBalance, onApiRequestFail);

output флеша:
Цитата:

{"response":0}
Но откуда там взялся ответ? Почему не выполняется функция "fetchUserBalance"? И каким образом можно этот ответ закинуть в какую-нибудь переменную? Знаю что должно быть:
Код AS3:

for (var key: String in data[0]) { }

но каким образом? Функция "fetchUserBalance" ведь не выполняется

Есть еще одни вопрос, связанный с порядком выполнения функций, вопрос в этом сообщении

carrotoff 30.03.2011 16:07

ответ приходит в формате JSON, поставьте в параметре формат ответа XML, чтобы обрабатывать его так:
Код AS3:

for (var key: String in data[0]) { }

иначе разбирайте JSON.

Цитата:

{"response":0}
значит ничего вам не вернул сервер, функция onApiRequestFail срабатывает, если приходит ответ от сервера, в котором содержится ошибка,

А лучше почитайте Колина Мука

ghqe 30.03.2011 18:47

Цитата:

функция onApiRequestFail срабатывает
как она может срабатывать, если в этой функции всего одна строчка
Код AS3:

trace("error");

которая не работает?

Но весь прикол в том, что аналогичная функция срабатывает =)
Код AS3:

function fetchUserId (data:Object):String { 
    for (var key:String in data[0]) {
        UserId = String(data[0]['uid']);               
        trace(UserId);
    }
}
 
VK.api('getProfiles', { uids: flashVars['viewer_id'] }, fetchUserId, onApiRequestFail);



Еще у меня есть вопрос, связанный с порядком выполнения функций
Есть код:

Код AS3:

function fetchUserId (data:Object):String { 
    for (var key:String in data[0]) {
        UserId = String(data[0]['uid']);               
        trace(UserId);
    }
}
 
 
VK.api('getProfiles', { uids: flashVars['viewer_id'] }, fetchUserId, onApiRequestFail); // (1)
 
trace(UserId); // (2)
trace("------------------------------------------------------------"); // (3)

Output флеша:
Цитата:

null
------------------------------------------------------------
{"response":[{"uid":1234,"first_name":"name","last_name":"familija"}]}
1234
А теперь вопрос, почему компилятор выполняет функции в каком-то кривом порядке? Почему он сначала выполняет строчку (2), потом (3) и только потом (1)?

carrotoff 30.03.2011 20:53

Цитата:

как она может срабатывать, если в этой функции всего одна строчка
разве количество строчек определяет сработает ли вызов функции или нет? что-то совсем вас не понимаю.
с помощью метода api() вы посылаете запрос на сервер вконтакте с целой кучей параметров. Если сервер обработал ваш запрос, то вы получите ответ в любом случае. если запрос был составлен корректно, вы получите объект data, содержащий ответ сервера и сработает callback-функция fetchUserId, в которую параметром будет передан ответ сервера.

Если запрос составлен некорректно, то вы опять получите ответ от сервера, содержащий данные об ошибке, и сработает callback onApiRequestFail. и неважно что у вас там одна строчка trace("что-то там")


по второму вопросу

actionscript выполняется быстрее, чем приходит ответ от сервера. на строке [1] компилятор не будет ждать пока соображает удаленный сервер, а начнет выполнять код дальше.

ghqe 30.03.2011 21:34

Спасибо, правда я по первому вопросу имел ввиду немного другое. Ну ладно, это вроде бы не так важно.
А как посоветуете решить вопрос с ответом от сервера? Как узнать что ответ получен и выполнять код дальше?

carrotoff 30.03.2011 22:08

ну в принципе я уже ответил на этот вопрос.
в данном случае для вас единственным сигналом, что пришел ответ для сервера, является срабатывание callback-функции.

По самому первому сообщению складывается, что у вас смутное представление, что это такое.
Вкратце выглядит это так. Дело в том, что в переменную можно записать ссылку на функцию, и вызывать функцию через эту переменную.

пример callback'a

Код AS3:

//...
 
  myFunction(showMessage); // вызываем функцию myFunction, в параметре ссылка на callback
 
//...
 
private function myFunction(callback:Function){
  callback("Я вызываю callback"); // вызываем функцию переданную в качестве параметра
}
private function showMessage(msg:String):void{
  trace(msg);
}

Вот vk.api устроен по тому же принципу. Отправляете запрос на сервер VK, когда получаете ответ, вызывается функция, переданная параметром onComplete: Function в случае, если ответ нормальный, или onError:Function, если ответ содержит ошибку.

Чтобы понять что пришел ответ можно поступить примерно так:
Код AS3:

VK.api('getProfiles', {some_params}, onComplete, onError)
 
private function onComplete(data:Object){
  trace("Сервер прислал мне ответ");
  trace(data);
 
 // дальше разбираем ответ и продолжаем делать то, что нужно.
}
 
private function onError(data:Object){
  trace("Ошибка запроса. Вот ответ сервера");
  trace(data);
}

Всё, я, по-моему, написал максимально подробно. Если что-то опять не так, сформулируйте вопрос конкретнее

ghqe 31.03.2011 23:39

Ясно, спасибо

Добавлено через 44 минуты
Вот только почему не выполняется этот код я не понял
Код AS3:

VK.api('getUserBalance', { }, nm, onApiRequestFail); 
function nm (data:Object): void {
    trace("12121212121"); // этой строки нет в output
    for (var key:String in data[0]) {
          trace(data[0]['response']);                       
    }
}
function onApiRequestFail (data: Object): void {
            trace("error");
}

output флеша:
Цитата:

{"response":0}
Так как в output'е есть ответ, значит запрос выполняется. Функция "onApiRequestFail", не выполняется, что еще раз говорит о том, что запрос выполняется нормально. Но почему тогда не вызывается функция "nm"?

carrotoff 01.04.2011 13:10

посмотри метод api, нет ли там trace

ghqe 01.04.2011 16:51

Нет, нету.
В output почему-то всегда ответ сервера показывается, даже если нигде нет trace.
Вот например, обрабатываем ответ таким образом:
Код AS3:

for (var key:String in data[0]) {
    UserId = data[0]['uid'];               
    }
trace(UserId);

Но при этом в output бедет всеравно показыватся кроме trace(UserId) еще и весь ответ от сервера, т.е. в output будет следующее
Цитата:

{"response":[{"uid":123456,"first_name":"name","last_name":"famylija"}]}
123456
Так что тут дело в другом, почему-то функция не вызывается

carrotoff 01.04.2011 18:37

vk/api/DataProvider.as
Цитата:

В output почему-то всегда ответ сервера показывается, даже если нигде нет trace.
строка 86 "trace(loader.data);" вот ваш ответ

постарайтесь изучить всё повнимательней.
А лучше почитайте Колина Мука


Часовой пояс GMT +4, время: 05:26.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.