webentwicklung-frage-antwort-db.com.de

Wie verwende ich Q Promise in node.js?

Dies mag eine einfache Frage sein, aber ich bin neu in Versprechungen und versuche herauszufinden, wie man Q in node.js.

Ich sehe das Tutorial beginnt mit einem

promiseMeSomething()
    .then(function (value) {}, function (reason) {});

aber ich verstehe nicht genau, woher der .then kommt. Ich denke, es kommt von

var outputPromise = getInputPromise()
    .then(function (input) {}, function (reason) {});

aber woher kommt getInputPromise()? Ich finde keine vorherige Erwähnung.


Ich habe es so in mein Projekt aufgenommen

var Q = require('q');

// this is suppose, the async function I want to use promise for
function async(cb) {
    setTimeout(function () {
        cb();
    }, 5000);
}

async(function () {
    console.log('async called back');
});

Wie verwende ich Q und dessen .then Hier in meinem Beispiel?

33
laggingreflex

promiseMeSomething() gibt ein Q-Versprechungsobjekt zurück, das die Funktion then enthält, die defined ist

Promise.prototype.then = function (fulfilled, rejected, progressed) {

Der einfachste Weg, ein Promise-Objekt zu erstellen, ist die Verwendung des Funktionskonstruktors Q

new Q(value)

erstellt ein neues Versprechen Objekt. Sie können dann die Erfolgs- und Fehlerbehandlungsroutinen wie folgt anfügen

new Q(value)
.then(function(/*Success handler*/){}, function(/*Failure handler*/){})

Übergeben Sie außerdem eine einzelne nodejs-style-Funktion an .then Funktion, ruft diese Funktion mit dem Erfolgswert wie folgt auf

callback(null, value)

oder wenn es ein Problem gibt, dann

callback(error)

Für Ihren speziellen Fall akzeptiert setTimeout die aufzurufende Funktion als ersten Parameter. Es würde also einige Zeilen Code erfordern, damit es wirklich mit Versprechungen funktioniert. Also hat Q eine bequeme Funktion für diesen Zweck, Q.delay , das so verwendet werden kann

var Q = require('q');

function async() {
    return Q.delay(1000)
}

async()
.then(function() {
    console.log('async called back');
});

Sie können es so kürzer schreiben

Q.delay(1000)
    .then(function() {
        console.log('async called back');
    });

Wenn Sie die Rückruffunktion mit einem anderen Wert aufrufen möchten, können Sie dies folgendermaßen tun

Q.delay(1000, "Success")
    .then(function(value) {
        console.log('async called back with', value);
    });

Dies ist nützlich, wenn Sie eine Verzögerung zwischen zwei Funktionen wünschen und die zweite Funktion von der ersten Funktion abhängt.

19
thefourtheye