2015-10-02 3 views
14

Stiamo usando ECMAScript 6 promises.notifiche di avanzamento in Promessa ECMAScript

Abbiamo bisogno di implementare le notifiche di progresso per l'utente finale (questo è puro requisito UX). So che altri framework di promessa (la libreria Q promise, ad esempio) lo consentono.

Come possiamo adottare un tipo di indicazione di avanzamento più elegantemente?

Oppure dobbiamo migrare in un altro framework? (Non so come stimare lo sforzo di quest'ultimo)

risposta

14

Le promesse ES2015 non avranno mai una progressione. Le promesse rappresentano un valore finale singolare. Se vuoi più valori puoi guardare in osservabili - o mettere i progressi sulla funzione di ritorno promessa.

Mettere i progressi sulla funzione di restituzione promessa è piuttosto semplice. Fondamentalmente si prende una richiamata come parametro per la funzione e la si chiama ogni volta che si verifica una notifica di avanzamento.

Ecco alcuni testo adattato dalla nostra guida al bluebird:

progressione ha componibilità e le questioni concatenamento con le API che utilizzano promessa gestori di progressione. Mentre le altre librerie si allontanano dall'API di progressione poiché ha davvero poco a che fare con le promesse, lo stesso farà Bluebird. L'implementazione del caso di utilizzo comune delle barre di avanzamento può essere eseguita utilizzando un modello simile a IProgress in C#.

utilizzando jQuery prima:

Promise.resolve($.get(...)) 
    .progressed(function() { 
     // ... 
    }) 
    .then(function() { 
     // ... 
    }) 
    .catch(function(e) { 
     // ... 
    }) 

utilizzando jQuery dopo:

Promise.resolve($.get(...).progress(function() { 
     // ... 
    })) 
    .then(function() { 
     // ... 
    }) 
    .catch(function(e) { 
     // ... 
    }) 

implementazione delle interfacce generali di progresso come in C#:

function returnsPromiseWithProgress(progressHandler) { 
    return doFirstAction().tap(function() { 
     progressHandler(0.33); 
    }).then(doSecondAction).tap(function() { 
     progressHandler(0.66); 
    }).then(doThirdAction).tap(function() { 
     progressHandler(1.00); 
    }); 
} 

returnsPromiseWithProgress(function(progress) { 
    ui.progressbar.setWidth((progress * 200) + "px"); // update with on client side 
}).then(function(value) { // action complete 
    // entire chain is complete. 
}).catch(function(e) { 
    // error 
});