Comment collecter la valeur d’un tableau dans la boucle Nodejs?

J’ai écrit le code ci-dessous, en essayant de collecter les vidéos dans un tableau, puis de revenir. Le code est faux, mais je ne trouve pas la bonne façon de procéder.

var redis = require('redis'); var client = redis.createClient(); app.get('/topvideos', function(req, res){ res.type('application/json'); var topvideos = []; client.hkeys("topvideos", function(err,replies) { console.log("Results for video:"); console.log(replies.length + " videos:"); replies.forEach(function (reply, i) { client.hget("topvideos",i, function (err, reply) { console.log(i + ": " + reply ); topvideos.push(reply); }); }); } var ssortingng = JSON.ssortingngify(topvideos) res.send(ssortingng); }); 

Y a-t-il un motif élégant que je pourrais suivre?

Vraisemblablement, la méthode .hkeys est asynchrone. Cela signifie que vous devez écrire du code qui sait quand tous les éléments asynchrones sont terminés afin que vous puissiez ensuite (et seulement ensuite) res.send() à votre res.send() final avec l’accumulation des résultats.

Il existe de nombreuses façons de savoir quand toutes les opérations asynchrones sont terminées. Mon préféré est de satisfaire toutes les fonctions impliquées et d’utiliser Promise.all() . Mais, puisque vous n’utilisez pas encore de promesses dans ce code, voici une méthode utilisant un compteur manuel. Incrémentez le compteur chaque fois que vous démarrez une tâche asynchrone. Décrémentez le compteur chaque fois que vous terminez une tâche asynchrone. Lorsque le compteur atteint zéro, toutes les opérations asynchrones sont effectuées:

 var redis = require('redis'); var client = redis.createClient(); app.get('/topvideos', function(req, res){ res.type('application/json'); var topvideos = []; var cntRemaining = 0; client.hkeys("topvideos", function(err,replies) { console.log("Results for video:"); console.log(replies.length + " videos:"); replies.forEach(function (reply, i) { ++cntRemaining; client.hget("topvideos",i, function (err, reply) { console.log(i + ": " + reply ); topvideos.push(reply); --cntRemaining; if (cntRemaining === 0) { res.send(JSON.ssortingngify(topvideos)); } }); }); } }); 

Vous pouvez utiliser hgetall

 client.hgetall("topvideos", function(err, videos){ var keys = Object.keys(videos); res.send(JSON.ssortingngify(keys.map(function(key){return videos[key];}))); }); 

Documentation

En outre, je recommande d’envelopper toutes les tâches séparées avec des fonctions distinctes, telles que:

 var async = require('async'); function getKeyValueMap(obj) { return function(key, next) { return next(null, obj[key]); } } function getValues(obj, next) { async.map(Object.keys(obj), getKeyValueMap(obj), next); } function getVideoList(next) { client.hgetall("topvideos", function(err, videos){ if (err) return next(null, []); getValues(videos, next); }); } function response(err, data) { if (err) return res.send(err.message) return res.send(JSON.ssortingngify(data)); } getVideoList(response);