簡體   English   中英

使用node-redis獲取多個密鑰

[英]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尚未填充結果。

如果您想知道何時完成多個異步調用,那么您必須以非常不同的方式編碼。 並且,結果只能在回調函數內部使用,而不是在函數末尾。

總而言之,我發現您的代碼存在多個問題:

  1. client.get()是異步的,所以當你的函數返回時它還沒有完成
  2. 您應該在client.get()調用中使用i而不是num ,這樣每次通過for循環都會生成不同的請求。
  3. 循環中的i值必須在閉包中被凍結,以便保留它在稍后調用的回調函數中使用的值。
  4. 如果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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM