Desenvolvo a algum tempo com o Adobe Flex e uma das coisas que não
consigo entender bem e que até hoje me é um grande problema para
solucionar é como fazer sincronismo de dados recebidos de um
HTTPService com o Flex. Gostaria de saber se alguem poderia me ajudar
a entender como fazer para recuperar dados de uma maneira sincrona ou
se esse tipo de coisa é realmente impossível de fazer com o Flex.
Ex prático para Entendermos o que eu quero dizer:
Supondo estarmos fazendo um cadastro de clientes e que assim que o
cliente for cadastrado, deve ser exibido um Alert com o telefone da
central de atendimento mais próxima de acordo com o Unidade Federativa
(Estado brasileiro) informado.
Vamos supor que se ele for do Rio de Janeiro, deve ser enviado uma
mensagem com o número (21) 2222-2222, se for de São Paulo (11) 3333-
3333, Minas (31) 4444-4444 e assim por diante, sabendo que a
informação do telefone está em um serviço do tipo HTTPService.
Eu sei que se colocarmos numa função no evento "result" poderemos
fazer isso fácil, mas gostaria de saber se é possível fazer dentro da
mesma rotina de código onde disparamos o método send() do
HTTPService, fazendo com que a recuperação dos dados seja feita de
maneira "sincrona".
Peço a ajuda de vocês pois este tem sido um grande tabu a ser vencido
para mim e para empresa onde tenho a intenção de popularizar cada vez
mais o Flex.
Obrigado.
Rodolpho Loreto
Obrigado pela resposta.
Bem, o exemplo que eu descrevi é uma situação hipotética. O que eu
gostaria mesmo de saber é se é possível fazer a comunicação com o
Banco de Dados de maneira sincronizada, enviando uma requisição,
recebendo esse valor e trabalhando o mesmo logo em seguida a sua
recepção. No caso do meu sistema as vezes preciso fazer lógicas
baseadas em informações coletadas na base de dados de maneira
sequencial.
Como posso fazer a tela de loading para aguarda a recepção do dado que
eu enviei?
Obrigado mais uma vez,
Rodolpho Loreto
Abraços,
Daniel Schmitz
Vejo várias pessoas que estão començando no flex com esse problema de
entender, ou,
não utilizar corretamente o esquema de dados assincronos.
Pra resolver o seu problema é só definir o result do httpService
(RemoteObject, etc) para uma função
que trate os dados.
Ex.:
<HttpService id="bla" result="minhaFuncao()" />
private function minhaFuncao(): void {
// aki vc faz a logica q vc quer e tambem atribui o valor da
resposta pra um componente ou variavel
}
Como exemplo acima, vc tem total controle do que vem do serviço, é só
definir a propriedade result,
que quando o dado for retornado da chamada será disparado, e nessa
função que capturamos os
dados da busca e tratamos esse resultado se necessário.
O q eu tenho visto por aí é q algumas pessoas, utilizam direto com
data binding o resultado
do HttpService para o componente que quer mostrar os dados, por isso
não compreendem
corretamente como funciona o esquema dos dados assíncronos.
No exemplo abaixo, que as vezes por falta de conhecimento é utilizado
(ou por não precisar tratar os dados),
você não tem controle de quando o resultado virá, pois você está
atribuindo diretamente o resultado do seriço
ao componente.
Ex.:
<HttpService id="bla" result="minhaFuncao" />
<mx:Label text="{bla.lastResult.qualquerCoisa}" />
Espero ter ajudado.
[]s
Fábio Goll
Criei um objeto HTTPService na minha página:
<mx:HTTPService
id="WS"
method="POST"
url="IWS.aspx"
resultFormat="xml"
showBusyCursor="true"
fault="IWS_Error(event)" />
no evento initialize eu coloco o seguinte código:
WS.addEventListener(ResultEvent.RESULT, result);
e coloco uma função:
private function result(event:ResultEvent):void
até aqui nada de novo, voce deve estar falando, veja como eu chamo a
função:
var param:Object = new Object();
param.action = "ConsultaUnidadePorEntidade";
param.codEntidade = xml.Table.Codigo;
var call:Object = WS.send(param);
call.marker = "ConsultaUnidadePorEntidade";
para cada método eu coloco um nome diferente no call.marker. Dentro da
função result eu coloco da seguinte forma:
var xml:XML;
var call:Object = event.token;
switch (call.marker)
{
case "ConsultaUnidadePorEntidade":
//codigo para pegar o resultado...
break;
}
assim, coloco todas as funções q eu preciso dentro de cada case que
ele não se perde com o sincronismo. Quando preciso do resultado de uma
chamada para fazer outra, faço a chamada pro próximo método dentro do
próprio case.
Espero ter ajudado
A ética diz muita coisa sobre o que deve e não deve ser feito, porém dizem,
não sei ao certo, talvez quem sabe neste link
[http://www.mininova.org/get/609258] você consegue fazer o download grátis
do curso, via torrent.
Abraço Garoto,
-Daniel