Usando resolve e reject da Deferred() da jQuery

O objeto Deferred da jQuery é extremamente poderoso e ainda não muito utilizado. Uma coisa interessante nele é registrar cadeias de chamadas (callbacks) e poder associá-las a estados de sucesso (resolve) ou erro (reject) de funções, sejam elas síncronas ou assíncronas.

Para o exemplo, preferi usar chamadas síncronas, visando a simplicidade. A idéia é que o usuário clique na área verde (uma div de id green) de uma página (o que vamos tratar como sucesso). Se clicar na vermelha (uma div de id red), trataremos como erro.

No javascript, vamos então criar um objeto Deferred:

var def = $.Deferred();

Vamos então a esse objeto associar alguns handlers:

– quando ele for resolvido:

def.done(function() {
   alert("Você clicou na área verde :-)");
});

– quando for rejeitado:

def.fail(function() {
   alert("Você clicou na área vermelha :-(");
});

– quando for tanto rejeitado como resolvido

def.always(function() {
   alert("Obrigado por testar!");
});

Com isso, temos 2 cadeias definidas já. Em caso do objeto ser resolvido, será dado um alert que indica que usuário clicou na área verde e depois um outro agradecendo o teste. Em caso de ser rejeitado, um alert falando que clicou na área vermelha e aí a mesma mensagem de agradecimento é invocada.

Para resolver ou rejeitar, é simples:

$("div#green").on("click", def.resolve);
$("div#red").on("click", def.reject);

Vejam no jsFiddle esse exemplo: http://jsfiddle.net/3J5zA/2/

Existem usos mais complexos e interessantes para o objeto Deferred, o exemplo feito é para mostrar como criar cadeias de resolve e reject de forma simples e invocá-las. Na documentação oficial pode-se encontrar mais explicações sobre os métodos usados, bem como de outros.

Google Analytics apenas em produção

O Google Analytics é uma ferramenta espetacular para trabalhar com métricas de navegação e e-commerce, implementei o "tracking" de diversos eventos no Eu Compraria que estão nos auxiliando a melhorar a interface e identificar os produtos mais procurados, pontos de desistência de compra, etc.

Mas como executamos diversos testes isso estava influenciando um pouco nossas métricas, então fui pesquisar como executar os códigos do Analytics apenas em produção (sem gambiarras) e descobri na documentação que tem uma variável do próprio GA que cuida disso.

Bloqueando o Google Analytics

O Analytics permite que você bloqueie a execução de determinada conta ativa na página através da criação de uma variável.

window['ga-disable-UA-XXXXXX-Y'] = true;

Substitua o UA-XXXXXX-Y pelo código identificador da sua conta no Google Acalytics e todas as páginas que tiverem esta variável (javascript) como true não irão armazenar cookies ou enviar dados para os servidores do Analaytics.

Com o Code Igniter adicionei no header das minhas views uma verificação do ENVIRONMENT da aplicação, sempre que for diferente de produção esta variável do Analytics é criada. Assim nem ambiente de homologação e nem ambiente de desenvolvimento afetam as métricas dos meus projetos. 🙂

Code Igniter – como carregar um helper em um model?

Nos últimos meses estou trabalhando bastante em dois projetos com Code Igniter: um manager (MongoDB + Code Igniter) e o sistema de e-commerce do Eu Compraria!

Aprendi vários macetes do framework e também melhorei o conhecimento que eu achava que tinha de MVC, antes eu fazia um uso excessivo de helpers para manipular coisas que hoje vejo que deveria estar no model – e em algumas funções precisei usar helpers no model, e não queria sobrecarregar a aplicação carregando este helper sempre.

Como carregar um helper em um model?

Em um controller normal carregar um helper do Code Igniter é muito simples:

$this->load->helper('url');

O $this no controller se refere a instância do Code Igniter e é ela que carrega os helpers, models e tudo mais do CI. Quando estamos em um model (estou usando Data Mapper e recomendo que você faça o mesmo) o $this é uma referência do própio objeto do model.

Para isso no model temos que recuperar a instância do CI e depois fazer com que esta carregue o helper (ou qualquer outra parte do código que o sistema precise), por exemplo:

$ci = get_instance();
$ci->load->helper('url');

Pronto, agora você pode carregar helpers, models e bibliotecas onde quiser: model, helper e bibliotecas.