Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > API приложений и сред

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 30.03.2011, 01:13
ghqe вне форума Посмотреть профиль Отправить личное сообщение для ghqe Найти все сообщения от ghqe
  № 1  
Ответить с цитированием
ghqe

Регистрация: Mar 2011
Сообщений: 11
По умолчанию 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" ведь не выполняется

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


Последний раз редактировалось ghqe; 30.03.2011 в 20:01.
Старый 30.03.2011, 16:07
carrotoff вне форума Посмотреть профиль Отправить личное сообщение для carrotoff Найти все сообщения от carrotoff
  № 2  
Ответить с цитированием
carrotoff
 
Аватар для carrotoff

Регистрация: May 2010
Сообщений: 543
ответ приходит в формате JSON, поставьте в параметре формат ответа XML, чтобы обрабатывать его так:
Код AS3:
for (var key: String in data[0]) { }
иначе разбирайте JSON.

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

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

Старый 30.03.2011, 18:47
ghqe вне форума Посмотреть профиль Отправить личное сообщение для ghqe Найти все сообщения от ghqe
  № 3  
Ответить с цитированием
ghqe

Регистрация: Mar 2011
Сообщений: 11
Цитата:
функция 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)?


Последний раз редактировалось ghqe; 30.03.2011 в 19:57.
Старый 30.03.2011, 20:53
carrotoff вне форума Посмотреть профиль Отправить личное сообщение для carrotoff Найти все сообщения от carrotoff
  № 4  
Ответить с цитированием
carrotoff
 
Аватар для carrotoff

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

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


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

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

Старый 30.03.2011, 21:34
ghqe вне форума Посмотреть профиль Отправить личное сообщение для ghqe Найти все сообщения от ghqe
  № 5  
Ответить с цитированием
ghqe

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


Последний раз редактировалось ghqe; 30.03.2011 в 21:37.
Старый 30.03.2011, 22:08
carrotoff вне форума Посмотреть профиль Отправить личное сообщение для carrotoff Найти все сообщения от carrotoff
  № 6  
Ответить с цитированием
carrotoff
 
Аватар для carrotoff

Регистрация: May 2010
Сообщений: 543
ну в принципе я уже ответил на этот вопрос.
в данном случае для вас единственным сигналом, что пришел ответ для сервера, является срабатывание 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);
}
Всё, я, по-моему, написал максимально подробно. Если что-то опять не так, сформулируйте вопрос конкретнее

Старый 31.03.2011, 23:39
ghqe вне форума Посмотреть профиль Отправить личное сообщение для ghqe Найти все сообщения от ghqe
  № 7  
Ответить с цитированием
ghqe

Регистрация: Mar 2011
Сообщений: 11
Ясно, спасибо

Добавлено через 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"?

Старый 01.04.2011, 13:10
carrotoff вне форума Посмотреть профиль Отправить личное сообщение для carrotoff Найти все сообщения от carrotoff
  № 8  
Ответить с цитированием
carrotoff
 
Аватар для carrotoff

Регистрация: May 2010
Сообщений: 543
посмотри метод api, нет ли там trace

Старый 01.04.2011, 16:51
ghqe вне форума Посмотреть профиль Отправить личное сообщение для ghqe Найти все сообщения от ghqe
  № 9  
Ответить с цитированием
ghqe

Регистрация: Mar 2011
Сообщений: 11
Нет, нету.
В 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
Так что тут дело в другом, почему-то функция не вызывается

Старый 01.04.2011, 18:37
carrotoff вне форума Посмотреть профиль Отправить личное сообщение для carrotoff Найти все сообщения от carrotoff
  № 10  
Ответить с цитированием
carrotoff
 
Аватар для carrotoff

Регистрация: May 2010
Сообщений: 543
vk/api/DataProvider.as
Цитата:
В output почему-то всегда ответ сервера показывается, даже если нигде нет trace.
строка 86 "trace(loader.data);" вот ваш ответ

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


Последний раз редактировалось carrotoff; 01.04.2011 в 18:39.
Создать новую тему Ответ Часовой пояс GMT +4, время: 03:52.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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