Domanda

Quali sono le differenze tra Deferreds, promesse e Futures?
C'è una teoria generalmente approvato dietro tutto questi tre?

È stato utile?

Soluzione

Alla luce di avversione apparente per come ho tentato di rispondere alla domanda del PO. La risposta letterale è, una promessa è una cosa condivisa w / altri oggetti, mentre una differita debba essere mantenuto privato. In primo luogo, una differita (che si estende generalmente Promessa) può risolversi, mentre una promessa potrebbe non essere in grado di farlo.

Se siete interessati nelle minuzie, quindi esaminare Promesse / A + .


Per quanto io sappia, l'obiettivo generale è quello di migliorare la chiarezza e l'accoppiamento allentare attraverso un'interfaccia standardizzata. Vedi Letture consigliate da @ jfriend00:

Invece di passaggio che direttamente callback alle funzioni, cosa che può portare a interfacce strettamente accoppiati, utilizzando promesse permette di preoccupazioni separate per il codice che è sincrona o asincrona.

Personalmente, ho trovato differita particolarmente utile quando si tratta di esempio modelli che sono popolate da richieste asincrone, script di carico che hanno reti di dipendenze, e forniscono feedback degli utenti per i dati dei moduli in modo non-blocking.

In effetti, confrontare la forma richiamata pura di fare qualcosa dopo il caricamento CodeMirror in modalità JS in modo asincrono (scuse, non ho usato jQuery in un mentre ):

/* assume getScript has signature like: function (path, callback, context) 
   and listens to onload && onreadystatechange */
$(function () {
   getScript('path/to/CodeMirror', getJSMode);

   // onreadystate is not reliable for callback args.
   function getJSMode() {
       getScript('path/to/CodeMirror/mode/javascript/javascript.js', 
           ourAwesomeScript);
   };

   function ourAwesomeScript() {
       console.log("CodeMirror is awesome, but I'm too impatient.");
   };
});

Per la versione formulato promesse (ancora una volta, le scuse, non sono aggiornati su jQuery):

/* Assume getScript returns a promise object */
$(function () {
   $.when(
       getScript('path/to/CodeMirror'),
       getScript('path/to/CodeMirror/mode/javascript/javascript.js')
   ).then(function () {
       console.log("CodeMirror is awesome, but I'm too impatient.");
   });
});

Scuse per il codice pseudo-semi, ma spero rende l'idea centrale piuttosto chiara. In sostanza, restituendo una promessa standardizzata, è possibile passare la promessa intorno, permettendo così per il raggruppamento più chiaro.

Altri suggerimenti

Queste risposte, tra cui la risposta selezionata, sono buone per le promesse che introducono concettualmente, ma privo di specifiche di che cosa esattamente le differenze sono in la terminologia che si verifica quando si utilizzano le librerie loro attuazione (e là sono importanti differenze).

Dal momento che è ancora una evoluzione spec , la risposta viene attualmente prodotta dal tentativo di esaminare entrambi i riferimenti (come wikipedia ) e le implementazioni (come jQuery ):

  • differite : Mai descritti nei riferimenti popolari, 1 2 3 4 ma comunemente utilizzato da implementazioni come arbitro di risoluzione promessa (attuazione resolve e reject). 5 6 7

    A volte deferreds sono anche promesse (di attuazione then), 5 6 altre volte è visto come più puro di avere solo la differita in grado di risoluzione, e costringendo l'utente di accedere alla promessa per utilizzando then. 7

  • Promessa :. La parola più all-encompasing per la strategia in fase di discussione

    Un oggetto proxy memorizzare il risultato di una funzione target cui sincronicità vorremmo astratto, oltre a esporre una funzione then accettando un'altra funzione di destinazione e il ritorno di una nuova promessa. 2

    Esempio da CommonJS :

    > asyncComputeTheAnswerToEverything()
        .then(addTwo)
        .then(printResult);
    44
    

    Sempre descritto nei riferimenti popolari, anche se mai specificato da la cui risoluzione responsabilità ricade. 1 2 3 4

    Sempre presente nelle implementazioni popolari, e mai dato abilites risoluzione. 5 6 7

  • Futuro : un termine apparentemente deprecato trovato in alcuni riferimenti popolari 1 ed almeno un'implementazione popolare, 8 ma apparentemente in fase di esaurimento di discussione nella preferenza per il termine 'promettere' 3 e non sempre menzionato nella intro popolareduzioni al tema. 9

    Tuttavia, almeno una libreria usa il termine generico per astrarre sincronicità e la gestione degli errori, pur non fornendo funzionalità then. 10 Non è chiaro se evitando il termine 'promessa' stato intenzionale, ma probabilmente un buona scelta dal momento che le promesse sono costruiti attorno a 'thenables.' 2

Bibliografia

  1. Wikipedia su promesse e Futures
  2. Promesse / A + spec
  3. DOM standard sulle promesse
  4. DOM standard promette Spec WIP
  5. DOJO Toolkit Deferreds
  6. jQuery Deferreds
  7. Q
  8. FutureJS
  9. sezione funzionale Javascript sul Promesse
  10. Futures in AngularJS Test di integrazione

Varie potenzialmente confondere le cose

Ciò che ha reso il tutto clicca per me era questa presentazione di Domenic Denicola.

In un github Gist , ha dato la descrizione che più mi piace, è molto conciso:

Il punto di promesse è di darci la composizione di nuovo funzionale ed errori ribolle nel mondo asincrona.

In altre parole, le promesse sono un modo che ci permette di scrivere asincrono il codice che è quasi altrettanto facile scrivere come se fosse sincrono .

Si consideri l'esempio, con la promessa:

getTweetsFor("domenic") // promise-returning async function
    .then(function (tweets) {
        var shortUrls = parseTweetsForUrls(tweets);
        var mostRecentShortUrl = shortUrls[0];
        return expandUrlUsingTwitterApi(mostRecentShortUrl); // promise-returning async function
    })
    .then(doHttpRequest) // promise-returning async function
    .then(
        function (responseBody) {
            console.log("Most recent link text:", responseBody);
        },
        function (error) {
            console.error("Error with the twitterverse:", error);
        }
    );

Funziona come se si stesse scrivendo questo codice sincrono:

try {
    var tweets = getTweetsFor("domenic"); // blocking
    var shortUrls = parseTweetsForUrls(tweets);
    var mostRecentShortUrl = shortUrls[0];
    var responseBody = doHttpRequest(expandUrlUsingTwitterApi(mostRecentShortUrl)); // blocking x 2
    console.log("Most recent link text:", responseBody);
} catch (error) {
    console.error("Error with the twitterverse: ", error);
}

(Se anche questo suona complicato, guardare quel presentazione!)

Per quanto riguarda la differita, è un modo per .resolve() o .reject() promesse. Nella Promesse / B spec, si chiama .defer(). In jQuery, è $.Deferred().

Si prega di notare che, per quanto ne so, l'attuazione promessa in jQuery è rotto (vedi che GIST), almeno per quanto di jQuery 1.8.2.
Si suppone attrezzi Promesse / A thenables , ma non si ottiene la gestione degli errori corretti si dovrebbe, nel senso che tutta la funzionalità "asincrona try / catch" non funzionerà. Che è un peccato, perché avere un "try / catch" con il codice asincrono è completamente raffreddare.

Se avete intenzione di utilizzare Promises (si dovrebbe provare a giocare con il proprio codice!), Utilizzare Kris Kowal di Q . La versione jQuery è solo alcuni aggregatore di callback per la scrittura di codice jQuery più pulito, ma non coglie il punto.

Per quanto riguarda futuro, non ho idea, non ho visto che in ogni API.

Modifica discorso YouTube di Domenic Denicola su promesse da @Farm 's commento qui sotto.

Una citazione di Michael Jackson (sì, Michael Jackson ) dal video:

Voglio che bruciare questa frase nella vostra mente: Una promessa è una Valore asincrono .

Questa è una descrizione eccellente: una promessa è come una variabile dal futuro - una prima classe di riferimento a qualcosa che, ad un certo punto, esisterà (o succederà)

.

Un Promessa rappresenta una proxy per un valore non necessariamente noto al momento della creazione della promessa. Esso consente di associare i gestori ad eventuali ragione valore successo o il fallimento di un'azione asincrona. In questo modo i metodi asincroni restituiscono valori come i metodi sincroni:. Al posto del valore finale, il metodo asincrono restituisce una promessa di avere un valore ad un certo punto in futuro

https://developer.mozilla.org/ eN-US / docs / Web / JavaScript / reference / Global_Objects / Promessa

Il metodo deferred.promise() consente una funzione asincrona per impedire altro codice di interferire con l'avanzamento o lo stato della sua richiesta interna. La promessa espone solo i metodi differite necessari per collegare i gestori aggiuntivi o determinare lo stato (, quindi, fatto, fallire, sempre, di tubi, di progresso, statali e promessa ) quelli, ma non che il cambiamento dello stato (< strong> determinazione, respingere, informare, resolveWith, rejectWith, e notifyWith ).

Se viene fornito bersaglio, deferred.promise() allegherà i metodi su di esso e poi restituire questo oggetto piuttosto che crearne uno nuovo. Questo può essere utile per fissare il comportamento Promessa a un oggetto già esistente.

Se si sta creando una differita, a mantenere un riferimento al differite in modo che possa essere risolto o rifiutato a un certo punto. Restituisce solo l'oggetto Promessa via deferred.promise () in modo da altro codice può registrare callback o ispezionare lo stato attuale.

Semplicemente possiamo dire che un Promessa rappresenta un valore che non è ancora noto dove come un differite rappresenta il lavoro che non è ancora finito.


 entrare descrizione dell'immagine qui

  • Un promise rappresenta un valore che non è ancora noto
  • Un deferred rappresenta il lavoro che non è ancora finito

Una promessa è un segnaposto per un risultato che è inizialmente sconosciuto durante una differita rappresenta il calcolo che si traduce in valore.

Riferimento

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