Buenas,
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
:
Ver originalfunction json2string(data) {
var html
// conversion a `html` de `data`
return html
}
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í:
Código Javascript
:
Ver originalfunction parse(url, elem) {
$.ajax(url, {
type: "GET",
dataType: "json",
success: function (data) {
elem.innerHTML = json2string(data)
},
});
}
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:
Código Javascript
:
Ver originalparse('api/ciudades', elem)
.done(function(data) {
alert('Yuhuuu! la petición ajax ha funcionado')
}
Si implementara la función `parse`así:
Código Javascript
:
Ver originalfunction parse(url, elem) {
return $.ajax(url, {
type: "GET",
dataType: "json",
});
}
no haría lo que deseo, ya que la instrucción por defecto de modificar el contenido del elemento deseado no se ejecutaría
Yo he pensado en implementar algo así:
Código Javascript
:
Ver originalfunction 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))
}
})
}
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?
Un saludo y gracias!