it-swarm.com.de

Aufgeschoben versus Versprechen

Was ist der Unterschied zwischen "Aufgeschoben" und "Versprechen" außer den jQuery-Versionen?

Was soll ich für meinen Bedarf verwenden? Ich möchte nur die fooExecute() aufrufen. Ich brauche nur die fooStart() und fooEnd(), um beispielsweise den HTML-Div-Status umzuschalten.

//I'm using jQuery v2.0.0
function fooStart() { /* Start Notification */ }
function fooEnd() { /* End Notification */ }
function fooExecute() { /* Execute the scripts */ }

$('#button1').on('click', function() {
    var deferred1 = $.Deferred();
    var promise1 = $.Promise();

    deferred1.???

    promise1.???
});
73
fletchsod

Erstens: Sie können $.Promise(); nicht verwenden, da es nicht existiert.

Ein zurückgestelltes Objekt ist ein Objekt, das erstellen ein Versprechen kann und seinen Status in resolved oder ändern kann rejected. Verzögerungen werden normalerweise verwendet, wenn Sie Ihre eigene Funktion schreiben und dem aufrufenden Code ein Versprechen geben möchten. Sie sind der Produzent des Wertes.

Ein Versprechen ist, wie der Name schon sagt, ein Versprechen über den zukünftigen Wert. Sie können Rückrufe anhängen, um diesen Wert zu erhalten. Das Versprechen wurde Ihnen "gegeben" und Sie sind der Empfänger des zukünftigen Wertes.
Sie können den Status des Versprechens nicht ändern. Nur der Code, der erstellt das Versprechen ist, kann seinen Status ändern.

Beispiele:

1. ( produzieren ) Sie verwenden zurückgestellte Objekte, wenn Sie Versprechen-Unterstützung für Ihre eigenen Funktionen bereitstellen möchten. Sie berechnen einen Wert und möchten steuern, wann das Versprechen erfüllt wird.

function callMe() {
    var d = new $.Deferred();
    setTimeout(function() {
        d.resolve('some_value_compute_asynchronously');
    }, 1000);
    return d.promise();
}

callMe().done(function(value) {
    alert(value);
});

2. ( forward ) Wenn Sie eine Funktion aufrufen, die selbst ein Versprechen zurückgibt, müssen Sie kein eigenes verzögertes Objekt erstellen. Sie können dieses Versprechen einfach zurückgeben. In diesem Fall erzeugt die Funktion keinen Wert, sondern leitet ihn weiter (Art von):

function fetchData() {
    // do some configuration here and pass to `$.ajax`
    return $.ajax({...});
}

fetchData().done(function(response) {
    // ...
});

3. ( receive ) Manchmal möchten Sie keine Versprechen/Werte erstellen oder weitergeben, sondern sie direkt verwenden, dh Sie sind der Empfänger einiger Informationen:

$('#my_element').fadeOut().promise().done(function() {
    // called when animation is finished
});

Natürlich können alle diese Anwendungsfälle auch gemischt werden. Ihre Funktion kann der Empfänger von Wert sein (zum Beispiel von einem Ajax-Aufruf) und darauf basierend einen anderen Wert berechnen (erzeugen).


Verwandte Fragen:

120
Felix Kling

Ein Versprechen können Sie für ein zurückgestelltes Objekt festlegen, das ausgeführt wird, wenn die zurückgestellte Erfassung abgeschlossen ist.

Beispiel aus der jQuery-Dokumentation :

<!DOCTYPE html>
<html>
<head>
  <style>
div {
  height: 50px; width: 50px;
  float: left; margin-right: 10px;
  display: none; background-color: #090;
}
</style>
  <script src="http://code.jquery.com/jquery-1.9.1.js"></script>
</head>
<body>

<button>Go</button>
<p>Ready...</p>
<div></div>
<div></div>
<div></div>
<div></div>


<script>
$("button").on( "click", function() {
  $("p").append( "Started...");

  $("div").each(function( i ) {
    $( this ).fadeIn().fadeOut( 1000 * (i+1) );
  });

  $( "div" ).promise().done(function() {
    $( "p" ).append( " Finished! " );
  });
});
</script>

</body>
</html>

Hier ist es in JSFiddle

Dies führt eine Funktion für jedes div aus und führt das .promise Code, wenn alle .each Ausführungen sind abgeschlossen.

2
Codeman