2012-08-22 27 views
15

Estoy escribiendo un analizador lleno de tareas asíncronas. Uso las promesas de JQuery para controlar y ordenar las tareas asincrónicas. Esta es una versión pseudo código de la función constructora:

/** 
    * @constructor 
    */ 
    function Parser(json) 
    { 
     return $.when(
      this.delete().then(this.insert(json)), 
      this.doSomething(), 
      this.doSomethingElse().then(this.update(json)) 
     ) 
    }; 

y esto es lo que parece una función de ejemplo como:

Parser.prototype.doSomething = function() 
{ 
    var dfd = $.Deferred(); 

    exampleTask(dfd.reject, dfd.resolve); 

    return dfd.promise(); 
}; 

A partir de los documentos de JQuery:

En el caso en que se pasan múltiples objetos aplazados a jQuery.when, el método devuelve la promesa de un nuevo objeto diferido "maestro" que rastrea el estado agregado de todos los aplazados que tiene b een pasó

¿Cómo puedo usar .progress() para notificar a alguien que se preocupa por el progreso general del analizador? p.

var parser = new Parser(json); 
parser.progress(function(prog){console.log(prog}); 

Heres un violín con lo que estoy tratando de hacer: http://jsfiddle.net/ashanova/RjULA/2/

Respuesta

14

Uso deferred.notify() para llamar al progressCallbacks. Por ejemplo:

function doSomething() { 
    var dfd = $.Deferred(); 

    var count = 0; 
    var intervalId = setInterval(function() { 
     dfd.notify(count++); 
     count > 3 && clearInterval(intervalId); 
    }, 500); 

    return dfd.promise(); 
}; 

var promise = doSomething(); 

promise.progress(function(prog) { 
    console.log(prog); 
});​ 

DEMO.

+0

Descubrí cómo usar .notify dentro de una función (como en su demo), pero quiero pasarla de nuevo al constructor y notificar el progreso general desde allí. Quiero ver dónde está el analizador en general, no sus funciones, si me sigues? – JonWells

+0

@Jaoa de esta manera: http://jsfiddle.net/ashanova/RjULA/2/ – JonWells

+0

@CrimsonChin: No estoy seguro si entendí su pregunta correctamente, pero en ese caso, necesitaría crear y almacenar una referencia al '$ .Deferred' en su constructor, para que pueda llamar a' notify' dentro de cada método. Algo en esta línea: http://jsfiddle.net/B7nzy/ –