2014-03-27 6 views
30

Dies könnte eine Frage sein, aber ich bin neu zu Versprechungen und versuchen herauszufinden, wie Q in node.js zu verwenden.Wie verwende ich Q-Versprechen in node.js?

Ich sehe die tutorial mit einem von

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

aber ich kann nicht begreifen, wo genau sich die .then kam beginnt. Ich denke, es kommt von

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

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


Ich habe es in meinem Projekt enthalten wie so

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 seine .then hier in meinem Beispiel?

+0

Ihr Beispiel ist kein großer Anwendungsfall für Versprechungen. Die "Then" -Funktion ist an Versprechen geknüpft, und ja, etwas muss dieses Versprechen schaffen. Manchmal tun Bibliotheken.Es ist ein MySQL-ähnliches Beispiel, aber Sie könnten hilfreich finden [eine Antwort, die ich jemandem gab] (http://stackoverflow.com/questions/22109487/nodejs-mysql-dump/22110015#22110015), in der ich die Antwort unter Verwendung von normal implementiere Rückrufe und dann die Verwendung von Q-Versprechen, mit starken Kommentaren zum Q-Teil, der illustriert, was vor sich geht. –

+0

verwandt: http://stackoverflow.com/questions/10545087/how-to-use-q-module-for-refactoring-mongoose-code – laggingreflex

+1

Related http://stackoverflow.com/questions/22519784/how-do- i-convert-an-existing-callback-api-zu-Versprechen –

Antwort

18

promiseMeSomething() wird ein Q Versprechen Objekt zurückgeben, die then Funktion darin haben, was defined ist, wie diese

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

Der einfachste Weg, um ein Versprechen Objekt zu erstellen, würde die Q Funktion nutzen zu Konstruktor, so

new Q(value) 

wird ein neues Versprechen Objekt erstellen. Sie können die Erfolgs- und Fehlerbehandlungsroutinen dann anbringen, wie diese

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

Außerdem, wenn Sie eine einzelne NodeJS-Style-Funktion zu .then Funktion übergeben, wird diese Funktion mit dem Erfolg Wert nennen wie diese

callback(null, value) 

oder wenn es ein Problem gibt, dann

callback(error) 

Für Ihren speziellen Fall übernimmt setTimeout die Funktion als ersten parame aufgerufen werden ter. Es würde also ziemlich wenige Codezeilen benötigen, damit es wirklich mit Versprechen funktioniert. Also, Q eine komfortable Funktion hat, zu diesem Zweck Q.delay, die wie diese verwendet werden können

var Q = require('q'); 

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

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

Sie können es kürzer schreiben wie diese

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

Wenn Sie die Callback-Funktion aufrufen wollte mit someother Wert, dann können Sie es tun, wie diese

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

dieser nützlich sein wird, wenn Sie eine Verzögerung zwischen zwei Funktionen haben wollen und die Die zweite Funktion ist abhängig von der ersten Funktion.