validacion - validar formulario javascript html5
¿Cómo convertir una muestra de devolución de llamada a un objeto diferido? (2)
Tengo una función que acepta una función de devolución de llamada donde paso los datos. ¿Se puede convertir esto en un objeto diferido para una mejor práctica?
Esto es lo que obtuve:
var chapters;
var getChapters = function (fnLoad) {
//CACHE DATA IF APPLICABLE
if (!chapters) {
//CALL JSON DATA VIA AJAX
$.getJSON(''/chapters.txt'')
.done(function (json) {
//STORE DATA IN LOCAL STORAGE
chapters = Lawnchair(function () {
this.save(json, function (data) {
//CALL CALLBACK ON DATA
fnLoad(data);
});
});
});
} else {
//RETURN ALREADY CREATED LOCAL STORAGE
chapters.all(function (data) {
//CALL CALLBACK ON DATA
fnLoad(data);
});
}
};
Entonces simplemente lo uso así:
this.getChapters(function (data) {
console.log(data);
});
¿Cómo puedo usarlo como una promesa aunque manteniendo el enfoque de caché?
this.getChapters().done(function (data) {
console.log(data);
});
Veo que ya ha aceptado una respuesta, sin embargo, si realiza un gran salto mental y almacena una promesa de chapters
lugar de chapters
, el código se simplificará significativamente.
En estos días, este es probablemente el enfoque adoptado más generalmente para una situación de "búsqueda / caché".
var chapters_promise;
var getChapters = function () {
//Cache data if applicable and return promise of data
if (!chapters_promise)
chapters_promise = $.getJSON(''/chapters.txt'').then(Lawnchair).then(this.save);
return chapters_promise;
};
Lo que en realidad se promete (los capítulos) vendrá determinado por los valores devueltos por las funciones Lawnchair
y this.save
, por lo que aún debe trabajar un poco.
getChapters()
siempre devolverá una promesa, independientemente de si los datos deben ser recuperados o ya están en la memoria caché. Por lo tanto, getChapters()
solo se puede usar con los métodos de promesa .then()
, .done()
, .fail()
o .always()
, por ejemplo:
getChapters().then(fnLoad);
No tiene otra forma de acceder a los chapters
pero eso es razonable ya que en cualquier llamada de getChapters()
, no se sabe si seguirá la $.getJSON()
o la rama de return
simple, que devuelven un $.getJSON()
idéntico. promesa.
var chapters;
var getChapters = function (fnLoad) {
var d = new $.Deferred();
//CACHE DATA IF APPLICABLE
if (!chapters) {
//CALL JSON DATA VIA AJAX
$.getJSON(''/chapters.txt'')
.done(function (json) {
//STORE DATA IN LOCAL STORAGE
chapters = Lawnchair(function () {
this.save(json, function (data) {
//CALL CALLBACK ON DATA
d.resolve(data);
});
});
})
.fail(function() { d.reject(); });
} else {
//RETURN ALREADY CREATED LOCAL STORAGE
chapters.all(function (data) {
//CALL CALLBACK ON DATA
d.resolve(data);
});
}
return d.promise();
};