2014-03-04 8 views
5

Ich dachte, ich ein anständiges Verständnis der Verheißungen hatte, bis ich mit einem simplifed Codeausschnitt unten in ein Problem lief. Ich hatte den Eindruck, dass die console.log Anrufe ausgeben würde first second third, sondern führt zu second third first.Javascript verspricht wartet nicht auf Vorsatz

Kann jemand erklären, warum die zweite und dritte Versprechen ohne Warten auf die erste, weiterhin auf der Lage sind.

var Q = require('q'); 

(function() { 

    var Obj = function() { 

    function first() { 
     var deferred = Q.defer(); 

     setTimeout(function() { 
     console.log('in the first') 
     deferred.resolve(); 
     }, 200); 

     return deferred.promise; 
    } 

    function second() { 
     return Q.fcall(function() { 
     console.log('in the second'); 
     }) 
    } 

    function third() { 
     return Q.fcall(function() { 
     console.log('in the third'); 
     }) 
    } 

    return { 
     first: first, 
     second: second, 
     third: third 
    } 
    }; 

    var obj = Obj(); 
    obj.first() 
    .then(obj.second()) 
    .then(obj.third()); 

}()); 

Antwort

6

Sie sollten nicht die Funktion aufgerufen wird, aber die Funktion, wie dieser

obj.first() 
    .then(obj.second) 
    .then(obj.third); 

Ausgabe

in the first 
in the second 
in the third 
+0

, die den Trick tat passieren. Der Grund, warum ich die Funktionen aufgerufen habe, ist, dass ich im eigentlichen Code Params an die Verheißungsmethoden übergeben muss, die hier weggelassen wurden. Es sieht so aus, als müsste ich es in eine zusätzliche Funktion einpacken. Danke für die Hilfe – chris