Domanda

Da quello che ho capito ci sono tre modi di chiamare codice asincrono:

  1. Eventi, per esempio request.on("event", callback);
  2. callback, ad esempio fs.open(path, flags, mode, callback);
  3. Le promesse

ho trovato il nodo-promessa biblioteca ma io non capisco.

Qualcuno potrebbe spiegare che cosa promesse sono tutto e perché dovrei usarlo?

Inoltre, perché è stato rimosso dal Node.js?

È stato utile?

Soluzione

Le promesse in node.js promesso di fare un certo lavoro e poi avevano callback separati che dovrebbe essere eseguito per il successo e il fallimento, così come i timeout di movimentazione. Un altro modo di pensare delle promesse in node.js era che erano emettitori che potrebbe emettere solo due eventi:. Successi ed errori

La cosa più cool promesse è è possibile combinarli in catene di dipendenza (fare Promessa C solo quando promettono un e Promessa B completo).

Per rimuovere dalla node.js nucleo, ha creato possibilità di costruire moduli con diverse implementazioni di promesse che possono sedersi sulla parte superiore del nucleo. Alcuni di questi sono nodo-promessa e Futures .

Altri suggerimenti

Dal momento che questa domanda ha ancora molti punti di vista (come il mio) ho voluto sottolineare che:

  1. node-promessa sembra piuttosto morto per me (ultimo commit era di circa 1 anno fa) e contiene quasi nessun test.
  2. Il dei futures sguardi modulo molto gonfio e mi è mal documentato (e penso che le convenzioni di denominazione sono solo male)
  3. Il modo migliore per andare sembra essere il quadro q, che è sia attiva e ben documentata.

Una promessa è una "cosa" che rappresenta le "eventuali" risultati di un'operazione per così dire. Il punto da notare qui è che, si astrae i dettagli di quando qualcosa accade e ti permette di concentrarsi su ciò che dovrebbe accadere dopo che qualcosa accade. Questo si tradurrà in codice pulito, mantenibile in cui invece di avere un callback all'interno di un callback all'interno di un callback, il codice sarà un po 'come:

 var request = new Promise(function(resolve, reject) {
   //do an ajax call here. or a database request or whatever.
   //depending on its results, either call resolve(value) or reject(error)
   //where value is the thing which the operation's successful execution returns and
   //error is the thing which the operation's failure returns.
 });

 request.then(function successHandler(result) {
   //do something with the result
 }, function failureHandler(error) {
  //handle
 });

Stati spec le promesse questa è una promessa

then

metodo deve restituire una nuova promessa che si compie quando la data successHandler o la richiamata failureHandler è finito. Ciò significa che è possibile concatenare insieme promesse quando si dispone di un insieme di attività asincrone che devono essere eseguite ed essere certi che la sequenza delle operazioni è garantita proprio come se si fosse usato callback. Così, invece di passare un callback all'interno di un callback all'interno di un callback, il codice con promesse sguardi incatenati come:

var doStuff = firstAsyncFunction(url) {
                return new Promise(function(resolve, reject) {
                       $.ajax({
                        url: url,
                        success: function(data) {
                            resolve(data);
                        },
                        error: function(err) {
                             reject(err); 
                        } 
                  });
               };
doStuff
  .then(secondAsyncFunction) //returns a promise
  .then(thirdAsyncFunction); //returns a promise

Per saperne di più su promesse e perché sono super cool, il blog cassa di Domenic: http://domenic.me/2012/10/14/youre-missing-the-point-of-promises/

nuova tutorial su promesse da parte dell'autore di PouchDB è probabilmente il migliore che ho visto da nessuna parte. Esso copre sapientemente gli errori rookie classici che vi mostra i modelli di utilizzo corrette e anche un paio di anti-pattern che vengono ancora comunemente utilizzati - anche in altri tutorial !!

Enjoy!

PS non ho risposto alcune altre parti di questa domanda come sono stati ben coperte da altri.

ha una serie di video , ognuno dei quali meno di dieci minuti lungo, che descrive come funziona la biblioteca WinJS promessa.

Questi video sono abbastanza informativo, e Mike riesce a mostrare la potenza delle API promessa con un paio di esempi di codice ben scelto.

var twitterUrl = "http://search.twitter.com/search.json?q=windows";
var promise = WinJS.xhr({ url: twitterUrl });

 promise = promise.then(
     function (xhr) {
     },
     function (xhr) {
         // handle error
     });

Il trattamento di come eccezioni sono trattati è particolarmente buono.

Nonostante i WinJs riferimenti, questa è una serie di video in generale di interesse, perché l'API promessa è sostanzialmente simile attraverso le sue molte implementazioni.

RSVP è un peso leggero implementazione promessa che passa il / A + test Promessa suite. Mi piace molto l'API, perché è simile in stile all'interfaccia WinJS.

Aggiornamento Apr-2014

Per inciso, i WinJS biblioteca è ora open source .

Un altro vantaggio di promesse è che la gestione degli errori e l'eccezione di lancio e la cattura è molto meglio che cercare di maniglia che con i callback.

Bluebird utensileria libreria promesse e ti dà grandi tracce lungo dello stack, è molto veloce, e mette in guardia errori non rilevati. E 'anche più veloce e usa meno memoria rispetto alle altre librerie promessa, secondo http://bluebirdjs.com/docs /benchmarks.html

Che cosa è esattamente una promessa?

Una promessa è semplicemente un oggetto che rappresenta il risultato di un'operazione asincrona. Una promessa può essere in uno dei seguenti 3 stati:

in attesa :: Questo è lo stato iniziale, significa che la promessa non è né soddisfatto né respinto.

adempiuto :: Ciò significa che la promessa si è compiuto, si intende il valore rappresentato da promessa è pronto per essere utilizzato.

respinto :: Ciò significa che l'operazioni non riuscite e quindi non può mantenere la promessa. A parte gli stati, ci sono tre entità importanti associati alle promesse che abbiamo veramente bisogno di capire

  1. funzione executor :: funzione esecutore definisce l'operazione asincrona che deve essere eseguita e il cui risultato è rappresentato dalla promessa. Si inizia l'esecuzione non appena l'oggetto promessa viene inizializzato.

  2. determinazione :: determinazione è una parametri passati alla funzione esecutore testamentario, e nel caso in cui l'esecutore viene eseguito correttamente, allora questa volontà è chiamata passando il risultato.

  3. rifiutare :: rifiutare è un altro parametro passato alla funzione di esecutore, e viene utilizzato quando la funzione executor non riesce. La causa del disturbo può essere passato per lo scarto.

Così ogni volta che si crea un oggetto di promessa, che abbiamo di fornire esecutore, Resolve e Rifiuta.

Promises

Ho anche esaminando le promesse in node.js di recente. Fino ad oggi la when.js sembra essere la strada da percorrere per la sua velocità e l'uso delle risorse, ma la documentazione su q.js mi ha dato molto migliore comprensione. Quindi l'uso when.js ma i q.js documentazione per capire il soggetto.

q.js readme su github:

  

Se una funzione non può restituire un valore o un'eccezione senza   il blocco, si può restituire invece una promessa. Una promessa è un oggetto che   rappresenta il valore di ritorno o l'eccezione generata che la funzione   può finalmente fornire. Una promessa può essere utilizzato anche come un proxy per un   oggetto remoto per superare la latenza.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top