2013-07-27 28 views
1

對於我的web應用,我使用Redis存儲數據,並且遇到了麻煩,使得我的函數(對其中的Redis進行異步調用)在查詢之後發出事件完成。對Redis完成異步查詢的可能解決方案太早

我已經把所有的數據庫配置放在一個模塊中,並且在同一個地方定義了方法。

這裏是我的代碼:

/* Redis config and connect */ 
var REDIS_URL = 'REDIS_CONFIG_STRING'; 
var rtg = require('url').parse(REDIS_URL); 
var redis = require('redis').createClient(rtg.port, rtg.hostname); 
redis.auth(rtg.auth.split(":")[1]); 

/* Read the users.json file into redis */ 
var loadJson = function(JSON) { 
    if (JSON === 'DEFAULT') JSON = DEFAULT_JSON; 
    var users = require(JSON); 
    for (var key in users) { 
     if(users.hasOwnProperty(key)) { 
      redis.set(key, JSON.stringify(users[key])); 
     } 
    } 
}; 

/* Do something to all keys in redis */ 
var allKey = function(callback) { 
    callback = callback || console.log; 
    redis.keys('*', function (err, keys) { 
     if (err) return console.log(err); 
     for(var i = 0, len = keys.length; i < len; i++) { 
      callback(keys[i]); 
     } 
    }); 
}; 

/* Get a key and something to it */ 
var getKey = function(key, callback) { 
    redis.get(key, function(err, result) { 
     callback(result); 
    }); 
}; 

/* Set a key to the value */ 
var setKey = function(key, value) { 
    redis.set(key, value); 
}; 

/* Read the whole redis db into a json */ 
var toJson = function(obj) { 
    allKey(function(key) { 
     getKey(key, function(result) { 
      obj[key] = JSON.parse(result); 
     }); 
    }); 
}; 

exports.client = redis;                                        
exports.loadJson = loadJson;                                      
exports.allKey = allKey;                                       
exports.getKey = getKey;                                       
exports.setKey = setKey;                                       
exports.toJson = toJson; 

的想法是沿着線的東西:

db = require('./models/redis.js'); 
db.toJson(obj).on('complete', function() {...}); 

,做給其他導出函數一樣的東西,讓所有的數據庫連接保持清潔並在其自己的模塊中分開。

如何將事件發射器分配給這些功能?

現在我遇到的問題是,我最終使用新創建的JS對象(使用toJson()),然後才從Redis數據庫填充完成。

回答

0

通過重新定義toJson()方法如下問題解決了:

var toJson = function(cb) {                
    //Retrieve all keys                                        
    client.keys('*', function (err, keys) {            
     //Error check                                        
     if (err) return console.log(err);             
     //Retrieve all values for the array of keys                                 
     client.mget(keys, function(err, reply) {           
      //Create a new object to enter the data into                               
      var obj = {};                 
      //Fill the obj with key-value pairs                                  
      for (var i = 0; i < keys.length; i++) {          
       obj[keys[i]] = JSON.parse(reply[i]);          
      } 
      //console.log(obj);                                      
      //Execute callback which makes use of the object                              
      cb(obj); 
     }); 
    }); 
}; 

不過,我仍然不能確定這是否是最佳的解決方案。定義事件發射器是否是更好的方法?