He creado una función que se encarga de transformar un objeto JSON en una vista HTML a mi conveniencia pongamos que así:
Código Javascript:
y una función que, hecha una petición ajax con jQuery, transforma el contenido de cierto elemento del DOM con ayuda de la función `json2string` tal que así:Ver original
function json2string(data) { var html // conversion a `html` de `data` return html }
Código Javascript:
Hasta aquí ningún problema. Ahora imaginemos que esta función quiero que devuelva un objeto $.Deferred con tal de poder usar promesas. Por ejemplo:Ver original
function parse(url, elem) { $.ajax(url, { type: "GET", dataType: "json", success: function (data) { elem.innerHTML = json2string(data) }, }); }
Código Javascript:
Ver original
parse('api/ciudades', elem) .done(function(data) { alert('Yuhuuu! la petición ajax ha funcionado') }
Si implementara la función `parse`así:
Código Javascript:
no haría lo que deseo, ya que la instrucción por defecto de modificar el contenido del elemento deseado no se ejecutaríaVer original
function parse(url, elem) { return $.ajax(url, { type: "GET", dataType: "json", }); }
Yo he pensado en implementar algo así:
Código Javascript:
Es decir, cambio el método done para que se ejecute tal como quiero. Sin embargo no me acaba de gustar. ¿Hay alguna manera más limpia o nativa de jQuery para hacerlo?Ver original
function parse(url, elem) { return $.ajax(url, { type: "GET", dataType: "json", }).pipe(function(data) { var dfd = $.Deferred() dfd.resolve() var promise = dfd.promise() var done = promise.done promise.done = function(callback) { elem.innerHTML = json2string(data) done(callback.bind(data)) } }) }
Un saludo y gracias!