Возврат JSON через node.js response.write имеет неожиданные результаты

Вот фрагмент:

objects = [];
client.keys 'objects*', (err,keys) ->
for (i = 0; i < keys.length; i++){
  client.hgetall(keys[i], function(err, obj) {
    objects.push(obj);
    if (i === keys.length){
      response.writeHead(200, {'Content-Type': 'application/json'});
      console.log(JSON.stringify(objects));
      response.write(JSON.stringify(objects));
      response.end();
    }
  }
}

Переменная objects — это массив объектов, которые я заполняю, запрашивая redis через node-redis, каждый из которых имеет 6 свойств. В консоли я получаю именно то, что и ожидал. Однако в клиенте я получаю массив только с последним объектом. Задаваясь вопросом, был ли это десерализатор клиента, я перехватил его в Fiddler, и это все тот же массив с одним объектом.

Вот что я получаю в консоли через console.log:

[{"prop1":"11","prop2":"12","prop3":"13","prop4":"14","prop5":"15","prop6":"16"},  {"prop1":"21","prop2":"22","prop3":"23","prop4":"24","prop5":"25","prop6":"26"},{"prop1":"31","prop2":"32","prop3":"33","prop4":"34","prop5":"35","prop6":"36"},{"prop1":"41","prop2":"42","prop3":"43","prop4":"44","prop5":"45","prop6":"46"},{"prop1":"51","prop2":"52","prop3":"53","prop4":"54","prop5":"55","prop6":"56"},{"prop1":"61","prop2":"62","prop3":"63","prop4":"64","prop5":"65","prop6":"66"}]

Я, должно быть, делаю что-то не так...


person CircusNinja    schedule 12.01.2012    source источник
comment
Можете ли вы привести пример сериализации объекта?   -  person Ryan Olds    schedule 12.01.2012
comment
Я отредактировал свой вопрос, чтобы включить более подробную информацию и, надеюсь, ответить на ваш комментарий. Кроме того, я изначально (неправильно) заявил, что вижу только первый объект, хотя на самом деле я получаю только последний объект.   -  person CircusNinja    schedule 12.01.2012
comment
Ваш асинхронный код неверен. Строка if (i === keys.length) всегда будет возвращать true, потому что вы проверяете, был ли client.hgetall вызван keys.length раз, а не были ли вызовы завершены. Вместо этого вы должны проверить (objects.length === keys.length)   -  person fent    schedule 13.01.2012
comment
Спасибо @DeaDEnD. Изменение этого сработало, поэтому, если вы хотите поместить это в качестве ответа, я буду использовать его. Этот асинхронный материал для меня в новинку, поэтому я не думал об этом. Спасибо еще раз!   -  person CircusNinja    schedule 16.01.2012
comment
Я не люблю кофескрипт.   -  person Zlatko    schedule 13.03.2013


Ответы (1)


Ваш асинхронный код неверен. Строка if (i === keys.length) всегда будет возвращать true, потому что вы проверяете, вызывался ли client.hgetall keys.length раз, а не были ли вызовы завершены. Вместо этого вы должны проверять (objects.length === keys.length) — DeaDEnD

person Community    schedule 12.03.2013