2016-07-29 4 views
1

Ich meine, wenn es einen Weg gibt, auf dem ein Objekt sein Versprechen über Zustandsänderungen mitteilt, kann jeder Callbacks auslösen, die auf die gleiche Weise an Versprechen geknüpft sind. Ich vermute, dass mir etwas in meinen Überlegungen fehlt, aber ich kann nicht genau herausfinden, was genau ist.Wie zeigt das Objekt seine Zusage, dass es gelöst wurde?

Antwort

2

Das Versprechen, dass jQuery Deferred zurückgibt, hat keinen Zugriff auf den Auflösungsmechanismus; Der Auflösungsmechanismus in Deferredhat Zugriff auf das Versprechen und/oder seine registrierten Rückrufe.

Bedenken Sie:

// A D object is a bit like a Deferred 
 
function D() { 
 
    // All of these vars are private 
 
    var state = "pending"; 
 
    var resolvedValue = null; 
 
    var callbacks = []; 
 
    // This is our promise, which is private 
 
    var p = { 
 
    then: function(callback) { 
 
     callbacks.push(callback); 
 
    } 
 
    }; 
 
    
 
    // Accessor for our promise 
 
    this.promise = function() { 
 
    return p; 
 
    }; 
 
    
 
    // Resolver -- note the promise object doesn't 
 
    // offer any access to this, just the D 
 
    this.resolve = function(value) { 
 
    if (state === "pending") { 
 
     state = "resolved"; 
 
     resolvedValue = value; 
 
     // Note that the resolver has access to the callbacks 
 
     // that the promise registers 
 
     setTimeout(function() { 
 
     callbacks.forEach(function(callback) { 
 
      try { 
 
      callback(resolvedValue); 
 
      } catch (e) { 
 
      } 
 
     }); 
 
     }, 0); 
 
    } 
 
    }; 
 
} 
 

 
// Usage 
 
var d = new D(); 
 
d.promise().then(function(value) { 
 
    console.log("Got " + value); 
 
}); 
 
d.resolve("foo");

Die nicht ist gemeint, jede Art von realer latenter Implementierung sein, es ist nur zu zeigen, gemeint, wie die das Versprechen ohne das Versprechen Zugang latenten kann in der Lage sein, das Zurückgestellte aufzulösen.

Sie können die vollständigen Details von jQuery Deferredin the source anzeigen. Aber beachte, dass jQuerys Deferred ein bisschen veraltet ist; Heutzutage ist es nicht mehr in Mode, zwei getrennte Objekte mit Namen zu haben (Deferred vs. Promise). Stattdessen akzeptiert das JavaScript-Objekt Promise eine Initialisierungsfunktion, und die Initialisierungsfunktion empfängt eine Resolver-Funktion, die zum Auflösen des Versprechens verwendet werden kann.


Es gibt noch zwei beteiligten Objekte: Das Versprechen und der Ausführungskontext durch den Aufruf den initializer erstellt, aber das ist etwas technisch zu werden ...

+0

Vielen Dank! Es ist genau das, wonach ich suche! – Phargelm

Verwandte Themen