2015-11-19 31 views
0

我在下面的代碼中做了什麼錯誤? left_labelright_label變量似乎總是「真實的」,當我知道我在Redis中將它們設置爲某個字符串時。我假設這是因爲client.get函數成功並返回true,但是如何獲取它以返回實際值?使用節點j從redis獲取值

var http = require('http'); 
var redis = require('redis'); 
var client = redis.createClient(6379, 127.0.0.1); 

var server = http.createServer(function (request, response) { 

    var left_label = client.get('left', function(err, reply) { 
     console.log(reply); 
     return reply; 
    }); 

    var right_label = client.get('right', function(err, reply) { 
     console.log(reply); 
     return reply; 
    }); 

    response.writeHead(200, {"Content-Type": "text/html"}); 

    var swig = require('swig'); 
    var html = swig.renderFile('/var/www/nodejs/index.html', { 
     left: left_label, 
     right: right_label 
    }); 

    response.end(html); 

}); 
server.listen(8000); 
console.log("Server running at http://127.0.0.1:8000/"); 
+0

Redis的訪問是異步的,'reply'具有實際價值,但是'left_label'和''right_label不會有它 –

回答

1

get調用是異步的,必須以這種方式處理。

建議將其與模塊的NPM文檔中建議的承諾庫(如bluebird)結合使用。

這樣,我們可以promisify redis模塊,並以更簡單的方式使用它。

var redis = require('redis'); 
bluebird.promisifyAll(redis.RedisClient.prototype); 

並使用新的異步版本的get函數,如下所示。

function getLabelValues(){ 
    var left_promise = client.getAsync("left").then(function(reply) { 
     return reply; 
    }); 

    var right_promise = client.getAsync("right").then(function(reply) { 
     return reply; 
    }); 

    return Promise.all([left_label, right_label]); 
} 

getLabelValues().then(function(results){ 
    //This is run when the promises are resolved 
    //access the return data like below 
    var left_label = results[0]; 
    var right_label = results[1]; 
}); 
+0

是的,這幾乎做到了。謝謝! –