PDA

Просмотр полной версии : Кто-нибудь юзал asSQL?


zorexundra
29.01.2013, 19:00
Подскажите, пожалуйста, кто знает (догадывается):
Создаю единый слушатель ответов SQL

function handleServerToApplication(data:Object, token:Object):void {
switch(token.info){
case "query1":
break;
case "query2":
break;
// и т.д. и т.д.
}
}

Теперь вызываю реакцию

var st:Statement = myConnection.createStatement();
var token:MySqlToken = st.executeQuery("SELECT * FROM table1");
token.info = "query1";
token.addResponder(new AsyncResponder(handleServerToApplication, fault, token));
token = st.executeQuery("SELECT * FROM table2");
token.info = "query2";
token.addResponder(new AsyncResponder(handleServerToApplication, fault, token));// и т.д. и т.д.

Есть ли возможность избавиться от постоянного вызова анонимных AsyncResponder?
Можно ли для этого как-то заюзать MySqlService?
Хочется задействовать именно один постоянный слушатель путём единождого вызова.
Очень мало примеров в сети :(

Спасибо за советы!

alatar
29.01.2013, 19:36
Имплементируйте mx.rpc.IResponder и вместо new AsyncResponder(handleServerToApplication, fault, token) пишите this, все данные будут приходить вам в result. Или используйте один респондер для всех токенов.

zorexundra
29.01.2013, 20:29
Хм... Как это выглядит в коде?

alatar
29.01.2013, 20:39
Что именно?

zorexundra
29.01.2013, 22:02
Обработка возвращаемых значений расширенным от MySqlToken классом имплементирующем IResponder,
или использование одного респондера для всех токенов. Либо и то, и то.

alatar
29.01.2013, 23:31
В вашем случае нет необходимости передавать токен в AsyncResponder.
хочу, чтобы один единственный слушатель всех sql-ответов различал эти запросы, которые возвращаются в произвольном порядке.
Вы можете добавлять один респондер во все ваши токены и он будет получать все result.

zorexundra
30.01.2013, 00:50
alatar, я правильно Вас понял?:
function handleServerToApplication(data:Object, token:Object):void {
switch(token.info){
case "query1":
break;
case "query2":
break;
// и т.д. и т.д.
}
}
var myAsyncResponder:AsyncResponder = new AsyncResponder(handleServerToApplication, fault)
var st:Statement = myConnection.createStatement();
var token:MySqlToken = st.executeQuery("SELECT * FROM table1");
token.info = "query1";
token.addResponder(myAsyncResponder);
token = st.executeQuery("SELECT * FROM table2");
token.info = "query2";
token.addResponder(myAsyncResponder);// и т.д. и т.д.
Это будет работать?
Есть ещё идеи как сократить код такого функционала (построить тотже функционал на других готовых компонентах - меня смущает частый вызов addResponder())?

GBee
30.01.2013, 01:06
private var _myAsyncResponder:AsyncResponder = new AsyncResponder(handleServerToApplication, fault)
private var _st:Statement = myConnection.createStatement();

private function sendSql(sql:String, info:String):MySqlToken
{
var token:MySqlToken = _st.executeQuery(sql);
token.info = info;
token.addResponder(_myAsyncResponder);
return token;
}

private function multiCall():void
{
sendSql('SELECT * FROM table1', 'query1');
sendSql('SELECT * FROM table2', 'query2');
sendSql('SELECT * FROM table3', 'query3');
sendSql('DROP TABLE table3', 'drop3');
}

zorexundra
30.01.2013, 11:51
GBee, я проверил своё предположение: если конструктору AsyncResponder не передать token, то handleServerToApplication не получает token в ответ на событие. Такто.

alatar
30.01.2013, 12:33
Зачем вам вообще знать какой токен вернул результат?

zorexundra
30.01.2013, 13:06
Моя любовь к switch case в тотальном обработчике событий требует определённости.
Подскажите приёмчик поинтересней.

alatar
30.01.2013, 13:17
То есть сначала вы сводите архитектуру позволяющую создать отдельный обработчик для каждой операции к одному обработчику, а потом в этом обработчике пытаетесь понять кто вернул вам результат? В чем сакральный смысл?

zorexundra
30.01.2013, 13:28
alatar, ответ: "я так научился" устроит Вас, или я должен обосновать рациональность своих методик? :)
Просто при обработке событий я всегда отталкивался от свойства event.target, а у mx.rpc несколько другой принцип. Это дезиориентирует меня вызывая когнитивный диссонанс. :)
Можно было бы ещё приплести сюда MVC, если бы я хоть чуть чуть в этом разбирался. :)

alatar
30.01.2013, 13:44
Подпишитесь на событие MySqlEvent.RESULT у токена (или у сервиса, если вы его используете) в resultSet события можно будет получить ссылку на токен. Респондеры можно будет не создавать.

zorexundra
30.01.2013, 15:13
function handleServerToApplication(event:MySqlEvent):void {
switch(event.resultSet.token.info){
case "query1":
break;
case "query2":
break;
// и т.д. и т.д.
}
}
var st:Statement = myConnection.createStatement();
var token:MySqlToken = st.executeQuery("SELECT * FROM table1");
token.info = "query1";
token.addEventListener(MySqlEvent.RESULT, handleServerToApplication);
token = st.executeQuery("SELECT * FROM table2");
token.info = "query2";
token.addEventListener(MySqlEvent.RESULT, handleServerToApplication);// и т.д. и т.д.
По мне, так более кошерно. Спасибо alatar!
Правда запись не сильно сократилась.

alatar
30.01.2013, 16:34
Правда запись не сильно сократилась.
А теперь еще раз перечитайте пост GBee (http://www.flasher.ru/forum/showpost.php?p=1118431&postcount=8).