2012-09-17 9 views
8

ich einige Probleme zu verstehen, wie "q" verwenden (https://github.com/kriskowal/q) eine verspricht Bibliothek für javascript:Wie mache ich eine Callback-Kette mit q?

var delayOne = function() { 
    setTimeout(function() { 
     return 'hi'; 
    }, 100); 
}; 

var delayTwo = function(preValue) { 
    setTimeout(function() { 
     return preValue + ' my name'; 
    }, 200); 
}; 

var delayThree = function(preValue) { 
    setTimeout(function() { 
     return preValue + ' is bodo'; 
    }, 300); 
}; 

var delayFour = function(preValue) { 
    setTimeout(function() { 
     console.log(preValue); 
    }, 400); 

}; 

Q.fcall(delayOne).then(delayTwo).then(delayThree).then(delayFour).end(); 

dies nur den Wert undefined zurück ...

Antwort

9

Die Grund, warum Sie „undefiniert“ ist, weil die Funktionen Sie Verkettungs nichts zurückkehr:

var delayOne = function() { 
    setTimeout(function() { 
    return 'hi'; 
    }, 100); 
}; 

delayOne Anrufe setTimeout und gibt nichts zurück (undefined).

Um Ihr Ziel zu erreichen, müssen Sie verwenden Q.defer:

var delayOne = function() { 
    var d = Q.defer();  
    setTimeout(function() { 
    d.resolve("HELLO"); 
    }, 100); 
    return d.promise; 
}; 

var delayTwo = function(preValue) { 
    setTimeout(function() { 
    alert(preValue); 
    }, 
    400); 
}; 

delayOne().then (delayTwo); 

http://jsfiddle.net/uzJrs/2/

+0

danke für die Lösung. Nebenbei muss ich die Entscheidung treffen, wenn ich Q verwende, was meine Codequalität stark verbessern würde, auf der anderen Seite würde es zu einer harten Abhängigkeit führen. Hast du Erfahrung wenn dieses Problem? – bodokaiser

+1

Wenn Sie viele verkettete asynchrone Aufrufe verwenden, benötigen Sie eine Bibliothek, um der "Pyramide des Schicksals" zu entkommen :). Ich persönlich bevorzuge asyncjs: https://github.com/caolan/async, und ich habe es mit Erfolg bei einigen mittelgroßen Projekten verwendet. – wroniasty

12

Wie wroniasty wies darauf hin, Sie ein Versprechen aus jeder dieser Funktionen zurückgeben müssen, aber Sie sollten auch alle Rückruf abstrakt orientiert APIs (wie setTimeout) so viel wie möglich und verwenden APIs, die Versprechen zurückgeben.

Im Fall von setTimeout, Q liefert bereits Q.delay(ms), die ein Versprechen zurückgibt, die nach der angegebenen Anzahl von Millisekunden gelöst werden, für eine perfekte setTimeout ersetzen:

var delayOne = function() { 
    return Q.delay(100).then(function() { 
     return 'hi'; 
    }); 
}; 

var delayTwo = function(preValue) { 
    return Q.delay(200).then(function() { 
     return preValue + ' my name'; 
    }); 
}; 

var delayThree = function(preValue) { 
    return Q.delay(300).then(function() { 
     return preValue + ' is bodo'; 
    }); 
}; 

var delayFour = function(preValue) { 
    return Q.delay(400).then(function() { 
     console.log(preValue); 
    }); 
}; 

Q.fcall(delayOne).then(delayTwo).then(delayThree).then(delayFour).done(); 

(Anmerkung: end mit done ersetzt wurde)

Verwandte Themen