validar validacion una tipos pasar parametros funciones funcion formularios formulario enviar ejemplos desde con carga asincrona antes javascript jquery jquery-deferred promise

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(); };

Ejemplo relevante