2015-12-28 1 views
0

Я пытаюсь составить список URL-адресов с помощью node_redis. В приведенном ниже коде я получаю длину в отсортированном наборе и добавляю элементы к этой позиции набора.Node.js с Redis - добавление добавленных наборов

client.on('connect', function() {  
    client.zcard('url',function(err, reply) { 
     if (reply == undefined) { 
      length = 0; 
     } else { 
      length = reply; 
     } 
    }); 
    client.zadd('url',length,pagename,function(err1, reply1) { 
     console.log("added="+reply1); 
    });    
    client.zrange('url',0,-1,'withscores',function(err2, reply2) { 
     console.log(reply2); 
    }); 
}); 

Моя проблема заключается в том, что reply1 возвращает неопределенное значение, которое означает, что length не назначается длиной установленного в предыдущем фрагменте коды. Что я здесь делаю неправильно?

+0

Это, вероятно, будет, потому что призыв к 'zcard' еще вернуться, когда вы звоните' zadd' - попробуйте подвигать '' zadd'inside обратного вызова zcard' (и затем сделать то же самое для 'zrange') –

+1

Вы вызываете код одновременно - и порядок завершения не гарантируется. Но похоже, что вы хотите - это последовательное выполнение (сначала, затем второй, затем третий). Используйте 'async.waterfall' из модуля' async' или просто обратный вызов цепи, чтобы каждая следующая функция выполнялась в предыдущем обратном вызове функции. – Meredian

ответ

0

Вы можете включить действие, которое должно произойти в ответе ZCARD таким образом, чтобы убедиться, что оно происходит после того, как обратный вызов имеет для вас ответ. пример у вас есть падает в том случае, когда JS уже проверки для значения длины, не дожидаясь его быть создан с помощью ZCARD вызова

client.on('connect', function() {  
    client.zcard('url',function(err, reply) { 
     if (reply == undefined) { 
      length = 0; 
     } else { 
      length = reply; 
     } 

     client.zadd('url',length,pagename,function(err1, reply1) { 
      console.log("added="+reply1); 
     }); 

     client.zrange('url',0,-1,'withscores',function(err2, reply2) { 
      console.log(reply2); 
     }); 
    }); 
}); 
0

Вы можете использовать NX (не существует) флаг и ZCOUNT.

ZCOUNT url -inf +inf 
ZADD url NX http://a.com 
ZRANGE url 0 -1 WITHSCORES 
Смежные вопросы