Como realmente usar Q promise no nó.js?
isto pode ser uma pergunta noob, mas sou novo nas promessas e a tentar descobrir como usar Q no nó.js.
vejo que o tutorialcomeça com um
promiseMeSomething()
.then(function (value) {}, function (reason) {});
Mas não consigo perceber de onde veio exactamente o .then
. Acho que vem de
var outputPromise = getInputPromise()
.then(function (input) {}, function (reason) {});
Mas de onde vem o getInputPromise()
? Não encontrei qualquer referência anterior a isso.
Eu incluí-o no meu projecto assim.
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');
});
Como é que eu uso Q
e o seu Aqui no meu exemplo?
1 answers
promiseMeSomething()
vai devolver um objeto de Promessa Q, Que terá then
função nele, que é definido , como este
Promise.prototype.then = function (fulfilled, rejected, progressed) {
A forma mais simples de criar um objecto prometido seria usar o construtor da função Q
, como este
new Q(value)
Vai criar um novo objecto promissor. Você pode então anexar os manipuladores de sucesso e fracasso, como este
new Q(value)
.then(function(/*Success handler*/){}, function(/*Failure handler*/){})
Além disso, se você passar uma única função do estilo nodejs para .then
função, ela vai chamar essa função com um valor de sucesso como este
callback(null, value)
Ou se houver um problema, então
callback(error)
Para o seu caso particular, setTimeout
aceita a função a ser chamada como o primeiro parâmetro. Então, seriam necessárias poucas linhas de código para que funcionasse realmente com promessas. Então, Q
tem uma função conveniente, para este fim, Q.delay
, que pode ser usado assim
var Q = require('q');
function async() {
return Q.delay(1000)
}
async()
.then(function() {
console.log('async called back');
});
Podes escrevê - lo mais curto assim.
Q.delay(1000)
.then(function() {
console.log('async called back');
});
Se quiseres chamar a função de callback com algum outro valor, então você pode fazê-lo assim
Q.delay(1000, "Success")
.then(function(value) {
console.log('async called back with', value);
});
Isto vai ser útil, quando você quer ter um atraso entre duas funções e a segunda função é dependente da primeira função.