Vou apresentar algo interessante aqui. Eu tenho este objeto JS, que invoca um endpoint externo (via JSONP) para buscar alguns dados. Agora, pode acontecer que o host esteja inativo ou cause um erro e, claro, isso interromperá nosso aplicativo.
Para este propósito, criei um espelho do pobre desse serviço e quando obtemos um erro do mestre, ele retorna para este outro endpoint.
A partir de 1.5+, o objeto jQuery AJAX (jqAjax) implementa a interface Promise , o que significa que você pode usar error
, ou success
callbacks, diretamente nesse objeto (como fazemos na linha # 8).
O outro aspecto interessante é o contexto, this
é o jqAjax
da solicitação original, o que significa que pode ser manipulado, enviado de volta com a vantagem de já ter sido configurado e ainda vinculado aos callbacks passados (ou seja. fn
)
Graças ao fato de JS ser uma linguagem dinâmica, podemos passar com segurança esse objeto para a $.ajax
função, que é bem projetada e tenta novamente a solicitação.
Uma última observação: isso foi projetado para ter apenas uma tentativa, mas é fácil implementar uma política com várias tentativas.
Agora aqui está o código:
var Service = (function () {
// private
var base_uri = 'http://service.org';
var fallback_base_uri = 'http://alt-service.org';
var jsonp = function ( url ) { return url + '.jsonp?callback=?' };
var get = function ( path, fn ) {
$.getJSON(jsonp(base_uri + path), fn)
.error(function( e ){
this.url = jsonp(fallback_uri + path);
$.ajax(this);
})
};
// public
return {
nodes: function( fn ) {
get('/nodes', fn);
}
};
})();
Service.nodes( function( data ) { /* ... */ });