Eh bien, je ne sais pas si mySQL.query()
renvoie un objet Promise ou non. En supposant que ce n'est pas le cas, essayons de simuler notre fonction mySQL
qui comprend une query
qui renverrait un résultat de manière asynchrone dans un délai de 200 ms.
mySQL = { '1234567890' : {name: "John Doe", age: 22},
'646494964' : {name: "Mary Jones", age: 28},
'4498549646' : {name: "Sam Johnson", age: 44},
'46654654664': {name: "Terry Gibson", age: 18},
'546646546' : {name: "Patricia Snow", age: 31},
query : function(q,cb){
setTimeout(function(db){
var result = db[q];
!!result ? cb(false,result)
: cb("Nothing found for query #: " + q, void 0);
}, Math.random()*200, this);
}
}
Maintenant, le snippet suivant va promettre tout appel asynchrone qui prend une donnée et une erreur de premier type de callback ( cb(err, res)
).
function promisify(fun){
return function(data){
return new Promise((v,x) => fun(data, (err,data) => !!err ? x(err)
: v(data)));
}
}
Une fois que nous avons promis mySQL.query
comme promisfy(mySQL.query.bind(mySQL))
il commencera à renvoyer des promesses. (Nous utilisons bind
ici depuis que le fun
variable de l'argument de la promisify
est affectée à la fonction mySQL.query
il invoquera mySQL.query
avec le this
comme promisify
et nous ne voulons pas cela. Nous sécurisons donc fun
pour être lié à mySQL
tout le temps. (Bonus JS connaissance ici.. !)
Bon, OK, nous sommes presque prêts, emballons le tout et interrogeons "séquentiellement" notre DB allumette qui supporte les promesses. Afin de lier séquentiellement une série de requêtes avec promesses dans un tableau, il est préférable d'utiliser une balise .reduce()
pour enchaîner les .then()
les étapes de la requête précédente à la suivante. Cool
function promisify(fun){
return function(...data){
return new Promise((v,x) => fun(...data, (err,data) => !!err ? x(err) : v(data)));
};
}
function mysqlQuery(query,cb){
setTimeout(function(){
var result = database[query];
!!result ? cb(false,result) : cb("Nothing found for query #: " + query, void 0);
}, Math.random()*200);
}
var numbers = ['1234567890', '646494964', '122', '4498549646', '46654654664', '546646546'],
mySQL = { '1234567890' : {name: "John Doe", age: 22},
'646494964' : {name: "Mary Jones", age: 28},
'4498549646' : {name: "Sam Johnson", age: 44},
'46654654664': {name: "Terry Gibson", age: 18},
'546646546' : {name: "Patricia Snow", age: 31},
query : function(q,cb){
setTimeout(function(db){
var result = db[q];
!!result ? cb(false,result)
: cb("Nothing found for query #: " + q, void 0);
}, Math.random()*200, this);
}
},
contents = [];
numbers.reduce((p,n) => p.then(c => promisify(mySQL.query.bind(mySQL))(n))
.then(d => contents.push(d), e => console.log(e)), Promise.resolve())
.then(_ => console.log(contents));
.as-console-wrapper { max-height: 100% !important; top: 0; }