[英]Getting multiple keys using node-redis
我正試圖從redis實例中獲取一堆密鑰。 我正在使用node-redis。 我正在使用循環:
for( var i=1; i<=num; ++i ){
client.get(key + ':' + num, function (err, reply) {
obj[num] = reply;
});
}
return obj;
但obj
只是未定義。 我覺得我可能會因為有問題get
顯然是異步調用。 還有另一種方法來實現這一目標嗎? 我應該只將值存儲在有序集中嗎?
我將根據編碼接口以及client.get()
異步的注釋來client.get()
。 這意味着它會“稍后”調用傳遞給它的回調函數,而不是立即調用。 因此,您不能使用同步編碼模式來收集多次調用client.get()
的結果,因為當函數返回時, obj
中的結果尚不可用。 因此, obj
尚未填充結果。
如果您想知道何時完成多個異步調用,那么您必須以非常不同的方式編碼。 並且,結果只能在回調函數內部使用,而不是在函數末尾。
總而言之,我發現您的代碼存在多個問題:
client.get()
是異步的,所以當你的函數返回時它還沒有完成 client.get()
調用中使用i
而不是num
,這樣每次通過for
循環都會生成不同的請求。 i
值必須在閉包中被凍結,以便保留它在稍后調用的回調函數中使用的值。 obj
實際上是未定義的,那么可能是因為你沒有將它初始化為空對象。 這是一種方法:
var obj = {};
var remaining = num;
for( var i=1; i<=num; ++i ){
// create a closure here to freeze the value of i in the callback
(function(i) {
client.get(key + ':' + i, function (err, reply) {
obj[i] = reply;
// see if all asynch calls are done yet
--remaining;
if (remaining === 0) {
// all asynch calls to client.get() are done now
// in here, you can use the obj object and the results put on it
}
});
})(i);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.