Cela peut être une question de noob, mais je suis nouveau dans les promesses et j'essaie de comprendre comment utiliser Q dans node.js.
Je vois le tutoriel commence par un
promiseMeSomething()
.then(function (value) {}, function (reason) {});
mais je n'arrive pas à comprendre d'où vient exactement .then
. Je suppose que ça vient de
var outputPromise = getInputPromise()
.then(function (input) {}, function (reason) {});
mais d'où vient getInputPromise()
? Je n'en trouve aucune mention antérieure.
Je l'ai inclus dans mon projet comme ça
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');
});
Comment utiliser Q
et son .then
Ici dans mon exemple?
promiseMeSomething()
va retourner un objet Q promise, qui aura then
fonction dedans, qui est defined , comme ceci
Promise.prototype.then = function (fulfilled, rejected, progressed) {
La façon la plus simple de créer un objet Promise serait d'utiliser le constructeur de la fonction Q
, comme ceci
new Q(value)
va créer un nouvel objet de promesse. Vous pouvez ensuite attacher les gestionnaires de réussite et d'échec, comme ceci
new Q(value)
.then(function(/*Success handler*/){}, function(/*Failure handler*/){})
De plus, si vous passez une seule fonction de style nodejs à .then
fonction, il appellera cette fonction avec la valeur de succès comme celle-ci
callback(null, value)
ou s'il y a un problème, alors
callback(error)
Pour votre cas particulier, setTimeout
accepte la fonction à appeler comme premier paramètre. Ainsi, il faudrait assez peu de lignes de code pour que cela fonctionne vraiment avec des promesses. Ainsi, Q
a une fonction pratique, à cet effet, Q.delay
, qui peut être utilisé comme ceci
var Q = require('q');
function async() {
return Q.delay(1000)
}
async()
.then(function() {
console.log('async called back');
});
Vous pouvez l'écrire plus court comme ça
Q.delay(1000)
.then(function() {
console.log('async called back');
});
Si vous souhaitez appeler la fonction de rappel avec une autre valeur, vous pouvez le faire comme ceci
Q.delay(1000, "Success")
.then(function(value) {
console.log('async called back with', value);
});
Cela va être utile lorsque vous souhaitez avoir un délai entre deux fonctions et que la deuxième fonction dépend de la première fonction.