2017-02-11 3 views
-2

Вот что я работаю с:Каков правильный способ разобрать CSV, создавая асинхронные HTTP-запросы после возвращения всех запросов, чтобы затем использовать агрегированные данные?

readableStream.pipe(csv.parse({ 
    auto_parse: true, 
    })) 
    .on('data', function(row) { 
    parseRow(row) 
    parseRowSomeMore(row) 
    useRowInfoInAsyncHTTPRequest(row) 
    useRowInfoINAsyncHTTPRequestAgain(row) 
    }); 
    readableStream.on('end', function() { 
    doSomethingWithParsedRowsAndReturnedAsyncRequestData(); 
    }); 

Надеется, что этот пример кода примеров является то, что я читаю файл CSV, и на каждой порции данных (что информация строки), я хочу проанализируйте эту строку как-то, а также выполните асинхронный HTTP-вызов, используя информацию о строках. Наконец, после прочтения данных, я хочу использовать агрегированные данные, как только все асинхронные запросы и синтаксический анализ строк будут завершены. Однако то, с чем я сталкиваюсь, заключается в том, что после того, как узел считывает последний кусок данных, он автоматически запускает «конечный» эмиттер, но последние асинхронные запросы, возможно, еще не обработаны, и, следовательно, информация в эмитенте «end» не отражает всю информацию, которую я хочу.

  1. Является ли это структурой/процессом, который я хочу для чтения CSV с использованием узла?
  2. Если это структура/процесс, как я могу гарантировать, что я получаю всю необходимую асинхронную информацию до срабатывания триггера «end»?
+0

Ваше название вопроса делает довольно понятным, что этот вопрос слишком широк. Возможно, вы могли бы разделить его на несколько вопросов и спросить их отдельно? Или, может быть, вы могли бы просто переписать его, поэтому он просит 1 краткую вещь – byxor

ответ

0

Вы можете хранить количество data событий, сколько было разрешено, и логическое значение для завершения потока. Каждый раз, когда асинхронный HTTP-запрос завершается, вы увеличиваете resolved и if ended && resolved === received, затем вы doSomethingWithParsedRowsEtcEtc().