2014-03-01 7 views
5

Ich lerne über Angular JS und im Moment versuche ich über Versprechen und asynchrone Programmierung zu verstehen, und ich habe diesen Zweifel über $q.defer(). Mein Punkt ist die folgende: In der Regel, wenn die Menschen mit dem Versprechen arbeiten sie so etwas tun, dass $ q Berücksichtigung bereits verfügbar

function someAsyncFunction() { 
    var deferred = $q.defer(); 

    /* Do things and if everything goes fine return deferred.resolve(result) 
     otherwise returns deferred.reject() 
    */ 

    return deferred.promise; 
} 

Was ist das wirklich tun? Wenn wir var deferred = $q.defer() tun, schaltet es sofort die gesamte Ausführung dieser Funktion auf einen anderen Thread um und gibt das Versprechen zurück, das eine Referenz auf die Ergebnisse dieser Operation ist, die dort noch ausgeführt wird?

Ist dies die Art und Weise, über die wir beim Erstellen von asynchronen Methoden nachdenken sollten?

+0

JavaScript ist single threaded (ohne Bahnarbeiter) – Lucius

+0

Sehr gute Erklärung in AngularJS API für $ q gegeben [link] (https: // docs .angularjs.org/api/ng/service/$ q) – ravi

Antwort

0

Angulars $q Dienst basiert auf der Javascript-Bibliothek Q. Sie können mehr darüber in der Q documentation lesen, oder lesen Sie den Code in der github repo. Ich denke, das von der Einführung snipped Teil der Dokumentation ist es am besten erklärt:

Wenn eine Funktion keinen Wert zurückgeben oder eine Ausnahme ohne Blockierung werfen, es stattdessen ein Versprechen zurückgeben kann. Ein Versprechen ist ein Objekt, das den Rückgabewert oder die ausgelöste Ausnahme darstellt, die die Funktion schließlich bereitstellen kann. Ein Versprechen kann auch als Proxy für ein entferntes Objekt verwendet werden, um Latenz zu überwinden.

0

Mit $ q u laufen Funktionen asynchron. Verzögerte Objekte signalisiert, dass etwas, eine Aufgabe erledigt ist.

var defer = $q.defer();// we create deferred object, which will finish later.

defer.promise // we get access to result of the deferred task 

.then(// .then() calls success or error callback 
    function(param) { 
     alert("i something promised " + param); 
     return "something"; 
    }); // u can use 1 or more .then calls in row 

defer.resolve("call"); //returns promise 

Hier Beispiel: http://jsfiddle.net/nalyvajko/HB7LU/29048/