Я использую Rx.js для обработки содержимого файла, создания HTTP-запроса для каждой строки и последующего объединения результатов. Однако исходный файл содержит тысячи строк, и я перегружаю удаленный http api, с которым я выполняю HTTP-запрос. Мне нужно убедиться, что я ожидаю, что существующий запрос HTTP будет обратный вызов, прежде чем запускать другой. Я был бы открыт для пакетной обработки и выполнения n
запросов одновременно, но для этого скрипта, выполняющего запросы в последовательном порядке, достаточно.Rx.js ждет завершения обратного вызова
У меня есть следующие:
const fs = require('fs');
const rx = require('rx');
const rxNode = require('rx-node');
const doHttpRequest = rx.Observable.fromCallback((params, callback) => {
process.nextTick(() => {
callback('http response');
});
});
rxNode.fromReadableStream(fs.createReadStream('./source-file.txt'))
.flatMap(t => t.toString().split('\r\n'))
.take(5)
.concatMap(t => {
console.log('Submitting request');
return doHttpRequest(t);
})
.subscribe(results => {
console.log(results);
}, err => {
console.error('Error', err);
},() => {
console.log('Completed');
});
Однако это не выполняет запросы HTTP в последовательный. Она выводит:
Submitting request Submitting request Submitting request Submitting request Submitting request http response http response http response http response http response Completed
Если удалить вызов concatAll()
то запросы в последовательный, но моя подписываться функция видит наблюдаемые прежде, чем запросы HTTP вернулись.
Как я могу выполнять HTTP-запросы серийно, чтобы результат был следующим?
Submitting request http response Submitting request http response Submitting request http response Submitting request http response Submitting request http response Completed
В качестве побочного примечания вы можете уменьшить сложность путем слияния операторов. 'map' +' flatMap' => 'flatMap',' map' + 'concatAll' =>' concatMap'. – paulpdaniels
Спасибо, я обновил пример, чтобы отразить это – toby