我正在使用node_redis为节点服务提供从redis获取的对象的JSON表示。我认为对很多人来说这可能是相对基本的东西,但我很难过。我已经到了之前发送我的回复的地步我经历了所有的哈希并存储了它们。这是coffeescript:
objects = []
client.keys 'objects*', (err,keys) ->
for key in keys
client.hgetall key, (err,obj) ->
objects.push obj
response.end JSON.stringify objects
并生成JavaScript:
objects= [];
client.keys('objects*', function(err, keys) {
var key, _i, _len, _results;
_results = [];
for (_i = 0, _len = keys.length; _i < _len; _i++) {
key = keys[_i];
_results.push(client.hgetall(key, function(err, obj) {
return objects.push(obj);
}));
}
return _results;
});
return response.end(JSON.stringify(objects));
我不知道在等待内部资源完成时如何将我的代码放在休假上。我怀疑有办法处理它,但我想不出任何东西。谢谢大家。
答案 0 :(得分:2)
所以你在调用client.keys(然后又为每个键调用client.hgetall?)之后迭代n个键然后返回JSON.stringify(对象),然后返回response.end(JSON)调用client.keys后的.stringify(objects))。
问题很简单 - 您需要在追加hgetkeys结果的函数内部呈现响应,但只有在您看到hgetkeys的所有响应后才会生成响应。
我不是coffeescript buff,但是这里的javascript版本应该有效:
objects= [];
client.keys('objects*', function(err, keys) {
var key, _i, _len, seen;
seen = 0;
for (_i = 0, _len = keys.length; _i < _len; _i++) {
key = keys[_i];
client.hgetall(key, function(err, obj) {
objects.push(obj);
seen++;
if (seen == len) {
return response.end(JSON.stringify(objects));
}
});
}
});
我应该注意,这样做的一个缺点是,如果你从来没有得到其中一个hgetall请求的响应,这将会超时并且你永远不会发出响应。更改存储哈希值的方式可能会更好,这样您就可以立即获取所有值,或者在一定时间后调用一个函数来发出响应,这样客户就不会永远等待。
我可以问你为什么选择在coffeescript中写这个?当节点通过像这样的转换层时,编写节点似乎是一件非常令人头痛的事。