我有一个用户数据库:配置文件,产品,配置以及用户可以拥有的其他内容。我试图找出一种方法来成功链接我的redis调用(一个“ getAll”函数),以便我可以使用所有这些东西返回一个对象,例如:
user = { profile: {}, products: {}, config: {}, ... }
这是我访问它们的方式/我想做的事情:
User.getAll = function(uid, next){ var user = {}; var multi = client.multi(); var key = 'user' + uid; client.hgetall(key, function(err, profile){ user.profile = profile; //signal that profile is ready } key = 'products:' + uid; client.smembers(key, function(err, arr){ key = key + ':'; for (i=0; i < arr.length; i++){ multi.hgetall(key + arr[i]); } multi.exec(function(err, products){ user.products = products; //signal that products is ready })); }) if (ready) { //obviously this isn't correct. return next(null, user); } }
收到所需的所有数据后,如何恢复?事件发射器是正确的方法吗?
我认为事件发射器在这里不是一个好选择。您可以跟踪所有呼叫,如下所示:
User.getAll = function(uid, next){ var requests = ["first", "second"]; var check_request = function(_key) { var idx = requests.indexOf(_key); if (idx!==-1) { requests.splice(idx, 1); } if (!requests.length) { next(user); } }; // ORIGINAL CODE + check_request var user = {}; var multi = client.multi(); var key = 'user' + uid; client.hgetall(key, function(err, profile){ user.profile = profile; check_request("first"); } key = 'products:' + uid; client.smembers(key, function(err, arr){ key = key + ':'; for (i=0; i < arr.length; i++){ multi.hgetall(key + arr[i]) } multi.exec(function(err, products){ user.products = products; check_request("second"); })); }) }
显然,您将使用比然后更有意义的方法requests = ["first", "second"];,但我希望您有所想法。
requests = ["first", "second"];
还可以看看async.js。这是一个不错的库,可以为您简化此操作,并且可以做更多的事情。