2013-08-22 5 views
8

Ich habe eine harte Zeit, Versprechungen der Reihe nach zu laufen.Wie man Versprechungen mit Q in Javascript sequenziell ausführt?

var getDelayedString = function(string) { 
    var deferred = Q.defer(); 

    setTimeout(function() { 
     document.write(string+" "); 
     deferred.resolve(); 
    }, 500); 

    return deferred.promise; 
}; 

var onceUponATime = function() { 
    var strings = ["Once", "upon", "a", "time"]; 

    var promiseFuncs = []; 

    strings.forEach(function(str) { 
     promiseFuncs.push(getDelayedString(str)); 
    }); 

    //return promiseFuncs.reduce(Q.when, Q()); 
    return promiseFuncs.reduce(function (soFar, f) { 
     return soFar.then(f); 
    }, Q());  
}; 

getDelayedString("Hello") 
.then(function() { 
    return getDelayedString("world!") 
}) 
.then(function() { 
    return onceUponATime(); 
}) 
.then(function() { 
    return getDelayedString("there was a guy and then he fell.") 
}) 
.then(function() { 
    return getDelayedString("The End!") 
}) 

onceUponATime() sollte Ausgang [ "Once", "auf", "a", "Zeit"] sequentiell, sondern sofort ausgegeben aus irgendeinem Grund sind sie zu sein.

jsFiddle hier: http://jsfiddle.net/6Du42/2/

Jede Idee, was ich falsch mache?

Antwort

15

sondern stattdessen werden sie aus irgendeinem Grund sofort ausgegeben.

Sie rufen sie schon hier:

promiseFuncs.push(getDelayedString(str)); 
//        ^^^^^ 

Sie würden function(){ return getDelayedString(str); } drücken müssen. Btw, anstatt zu einem Array in einer each Schleife zu drücken, sollten Sie lieber map verwenden. Und Sie eigentlich nicht wirklich brauchen, das sowieso, aber kann reduce über die strings Array direkt:

function onceUponATime() { 
    var strings = ["Once", "upon", "a", "time"]; 

    return strings.reduce(function (soFar, s) { 
     return soFar.then(function() { 
      return getDelayedString(s); 
     }); 
    }, Q());  
} 

Oh, und don't use document.write.

+0

Danke für die Antwort und zusätzliche Hinweise! – Nick

+1

Ja, es muss eine Funktion * factory * funktionieren, sonst wird es sofort ausgeführt. – FlavorScape

Verwandte Themen