Проблема выполнения функции exection nodejs / redis - PullRequest
1 голос
/ 14 марта 2012

У меня большая проблема для выполнения моей программы.мы используем redis hkey и проверяем, существует ли этот ключ

hgetall tags
"X5"
"6"
"X2"
"7"

это программа:

function firstChoiceChannel(){
        var i=0;
        var listRep
        console.log(tags);
        for(var k in tags){
            console.log('@'+k+'|'+tags[k]);
            client.hexists('tags',tags[k],function(err,rep){
                console.log(tags[k]+"=>"+k+' i '+rep)
                if(rep===1){
                         client.hget('tags',tags[k],function(err,rep){
                           console.log('value:'+rep);
                         })
                         console.log('ok');
                }
            });
        }
    }

это программа выполнения в консоли

[ 'X1', 'X2', 'X3', 'X5' ]
@0|X1
@1|X2
@2|X3
@3|X5
X5=>3 i 0
X5=>3 i 1
ok
X5=>3 i 0
X5=>3 i 1
ok
value:7
value:7

Почемупеременные теги [k] в подфункции client.hexists (... function (err, rep) {}) всегда равны последнему значению таблицы?

Спасибо за помощь

* Венсан 1014 *

1 Ответ

2 голосов
/ 14 марта 2012

Это потому, что client.hexists является асинхронным, поэтому, когда выполняется обратный вызов, цикл for уже завершен.Самый простой способ исправить это - отключить функцию:

function getIfExists(tag) {
  client.hexists('tags', tag, function(err,rep) {
    if(rep===1){
      client.hget('tags',tag,function(err,rep) {
        console.log('value:'+rep);
      });
    }
  });
}

Кроме того, синтаксис javascript for... in... не оптимален для массивов.

for(var i = 0, len = tags.length; i < len; i++) {
  getIfExists(tags[i]);
}

Или вы можете использовать Array.prototype.forEach:

tags.forEach(getIfExists);

Тем не менее, я не уверен, почему вы вообще делаете hexists?Вы можете просто hget это, вы получите null или значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...