Oi pessoal, tenho o seguinte problema. Imagine que tenho um algoritmo assim para implementar em javascript com ajax:
Ler um monte de dados.
Enviar e/ou receber algo via ajax para o servidor.
Processar a resposta ajax.
Enviar e/ou alguma outra coisa para algum outro lugar do servidor.
Fazer mais algum processmento.
Enviar e/ou receber mais lgo do servidor.
etc.
Tal como demonstrado no algoritmo, o processo parece bem simples. E de fato, implementar com ajax síncrono ficaria simples. No entanto ajax síncrono é coisa do capeta e não pode ser usado. Com o ajax assíncrono, usamos callbacks:
function meuAlgoritmo() {
// Fazer o processamento 1.
chamadaAjax(parametrosNecessarios, function(resposta) {
// Fazer o processamento 2.
chamadaAjax(maisParametros, function(resposta2) {
// Fazer o processamento 3.
chamadaAjax(parametros, function(resposta3) {
// etc.
});
});
});
}
O código funciona, mas a estrutura dele se torna uma verdadeira macarronada de tão confuso que fica.
Uma alternativa seria utilizar eventos:
[code]function meuAlgoritmoParte2(resposta) {
// Fazer o processamento 2.
chamadaAjax(maisParametros, meuAlgoritmoParte3);
}
function meuAlgoritmoParte3(resposta2) {
// Fazer o processamento 3.
chamadaAjax(parametros, meuAlgoritmoParte4);
}
function meuAlgoritmoParte4(resposta3) {
// etc.
}
function meuAlgoritmo() {
//Ler um monte de dados
chamadaAjax(parametrosNecessarios, meuAlgoritmoParte2);
}[/code]
Neste caso, o algoritmo foi picotado em vários pedaços espalhados. Além disso as variáveis definidas em uma parte do algoritmo não são facilmente visíveis nas outras partes, o que acaba exigindo mais gambiarras para torná-las visíveis. O código agora passa a ser um outro tipo de espaguete, em alguns casos melhor e em outros pior.
Um fato complicador é quando você quer fazer algo como o seguinte:
function foo() {
var x = minhaFuncao();
// Faz qualquer coisa com x.
}
Daí, quando você vai implementar minhaFuncao(), está o ajax lá no meio e você simplesmente não tem como retornar um valor.
Agora vem a pergunta:
Alguém conhece alguma abordagem ou design pattern que consiga fazer um ajax eficiente, assíncrono e ao mesmo tempo limpo e estruturado?