Как создать поток объектов из удаленного массива JSON через Highland?
Извлечение JSON из URL http://foo.bar/overview
с помощью:
const request = request.get('http://foo.bar/overview');
дает в ответе JSON, содержащий массив объектов:
[
{
id: 1,
narf: 'foo',
poit: 'bar',
},
{
id: 2,
narf: 'fizz',
poit: 'buzz',
},
]
Сейчас я пытаюсь настроить поток Highland, который содержит каждый объект массива. Тем не менее, мне кажется, что я могу построить его только из всего ответа на запрос, который, во-первых, кажется контрпродуктивным для всего потокового подхода.
Моим первым наивным решением было построить его через:
let body: [];
request.on('data', (chunk: any) => {
body.push(chunk);
}).on('end', () => {
const responseData = JSON.parse(Buffer.concat(body).toString());
_(responseData) // now I have the stream
});
Покопавшись, я также понял, что highland поддерживает настройку потока из самого объекта запроса:
_(request).map((bufferedResponse: Buffer) => {
const overview = <Overview[]> JSON.parse(bufferedResponse.toString()); // again this is the entire respone already
return _(overview); // now I have the stream
});
Как создать поток массив объектов из удаленного JSON на лету, не используя весь ответ, хранящийся в памяти?
1 ответ
Я пробую oboejs, и можно построить поток с помощью:
import * as _ from 'highland';
import oboe = require('oboe');
const idStream = _((push: any, next: any) => {
oboe({
url: 'http://foo.bar/overview',
method: 'GET',
headers: {
'X-Token': token,
},
}).node('{id narf poit}', (overview) => {
push(null, overview.id);
return oboe.drop;
}).done((response) => {
// without drop, the entire response would now be stored here
push(null, _.nil);
}).fail((reason) => {
console.error(reason);
push(null, _.nil);
});
});
idStream.each((id: number) => {
console.log(id);
});
Печать:
1
2