2012-08-22 11 views
15

Sto scrivendo un parser pieno di compiti asincroni. Io uso JQuery promette di controllare e ordinare i compiti asincroni. Questa è una versione di codice pseudo della funzione di costruzione:

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

e questo è ciò che una funzione di esempio si presenta come:

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

    exampleTask(dfd.reject, dfd.resolve); 

    return dfd.promise(); 
}; 

Dalla documentazione JQuery:

Nel caso in cui più oggetti differiti vengono passati a jQuery.quando, il metodo restituisce la promessa da un nuovo oggetto "principale" rinviato che tiene traccia dello stato aggregato di tutti i differiti che ha b een passò

Come posso usare .progress() per notificare a nessuno che si preoccupa per l'andamento generale del parser? ad es.

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

Heres un violino con quello che sto cercando di fare: http://jsfiddle.net/ashanova/RjULA/2/

risposta

14

Usa deferred.notify() per chiamare il progressCallbacks. Ad esempio:

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

Ho scoperto come usare .notify all'interno di una funzione (come nella demo), ma voglio passarlo di nuovo al costruttore e notificare i progressi generali da lì. Voglio vedere dove il parser è globale, non le sue funzioni - se mi segui? – JonWells

+0

@Jaoa come questo: http://jsfiddle.net/ashanova/RjULA/2/ – JonWells

+0

@CrimsonChin: Non so se ho capito correttamente la tua domanda, ma in tal caso, avresti bisogno di creare e memorizzare un riferimento al '$ .Deferred' nel costruttore, in modo da poter chiamare' notify' all'interno di ciascun metodo. Qualcosa in questo senso: http://jsfiddle.net/B7nzy/ –

Problemi correlati