Repetição jQuery AJAX

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 successcallbacks, diretamente nesse objeto (como fazemos na linha # 8).

O outro aspecto interessante é o contexto, thisé o jqAjaxda 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 $.ajaxfunçã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 ) { /* ... */ });