Pourrais-je demander un conseil sur un problème de flux de contrôle avec node et redis? (aka le codeur Python essayant de s'habituer à JavaScript)Problème de flux de contrôle avec noeud/redis et rappels?
Je ne comprends pas pourquoi client.smembers
et client.get
(recherches Redis) doivent être des rappels plutôt que de simples déclarations - cela rend la vie très compliquée.
Fondamentalement, je voudrais interroger un ensemble, et puis quand j'ai les résultats pour l'ensemble, je dois effectuer un get pour chaque résultat. Quand j'ai toutes les données, je dois le retransmettre au client.
Actuellement, je le fais à l'intérieur de deux rappels, en utilisant un objet global, qui semble désordonné. Je ne suis même pas sûr si c'est sûr (le code attendra-t-il un client.get
pour terminer avant de commencer un autre?).
Le code actuel ressemble à ceci:
var all_users = [];
// Get all the users for this page.
client.smembers("page:" + current_page_id, function (err, user_ids) {
// Now get the name of each of those users.
for (var i = 0; i < user_ids.length; i++) {
client.get('user:' + user_ids[i] + ':name', function(err, name) {
var myobj = {};
myobj[user_ids[i]] = name;
all_users.push(myobj);
// Broadcast when we have got to the end of the loop,
// so all users have been added to the list -
// is this the best way? It seems messy.
if (i === (user_ids.length - 1)) {
socket.broadcast('all_users', all_users);
}
});
}
});
Mais cela semble très compliqué. Est-ce vraiment le meilleur moyen de le faire? Comment puis-je être sûr que toutes les recherches ont été effectuées avant d'appeler socket.broadcast
?
tête de rayures Merci d'avance pour tout conseil.
1 plus [Débit] (https://github.com/willconant/flow-js) –
totalement d'accord avec les observations de questionneurs , Je me bats aussi avec ces concepts. 'C'est ce que Node est 'semble être un peu snob, désolé. –
@SSHThis c'est sur la [page principale] (http://nodejs.org/) du site Web de Node que l'explicite dit - async I/O. Je ne peux que spéculer sur des raisons qui vous ont fait choisir une technologie qui repose sur des concepts que vous ne comprenez pas (et que vous ne voulez pas comprendre). Essayez de l'obtenir et vous l'aimerez, sinon - choisissez quelque chose de différent. – elmigranto