Запись значений ReadStream в массив - PullRequest
0 голосов
/ 20 сентября 2018

Я пытаюсь прочитать csv синхронно, используя поток и ключевые слова async, await, используя lib-fast-csv.

Однако моя функция, похоже, не возвращает желаемый результат.Я предполагаю, что функции / потоки внутри моей написанной функции занимают больше времени, чем узел рассматривает возможность использования моей функции console.log для вывода длины массивов.

Как вернуть массив output со всеми считанными значениямииз потока CSV?

// CSV Processing
async function readCsv(csvfilepath) {
    var output = []
    var stream = fs.ReadStream(csvfilepath)
    var parser = csv.fromStream(stream, {
        headers: true
    }).on("data", function (data) {
        parser.pause()
        t(data, output, function (err) {
            // TODO: handle error
            parser.resume()
        });
    }).on("end", function () {
        console.log(output) // outputs desired array with objects
        console.log(output.length) // length is 100
        // return output // does not work. output == [].
    });


    var t = (data, out, callback) => {
        out.push(data) // push the objects to that array
        callback()
    }

    console.log(output.length) // says length = 0
    return output // output is empty, should be filled with values exactly like in the 'end' event from the stream
}

1 Ответ

0 голосов
/ 20 сентября 2018

Я решил это с помощью объектов Promise.Метод разрешения может использоваться для возврата данных, которые обрабатываются в событии 'end' потока, и в то же время могут использоваться с ключевыми словами async / await.

// CSV Processing
function readCsv(csvfilepath) {
    var stream = fs.ReadStream(csvfilepath)
    return new Promise((resolve, reject) => {
        var output = []
        const parser = csv.fromStream(stream, {headers:true})
            .on('data', (data) => {
                parser.pause();
                c(data, output, (err) => {
                    if (err) reject(err)
                    parser.resume()
                })
            })
            .on('end', () => {
                resolve(output) // extraction/return point of the desired data
            })
        var c = (data, out, callback) => {
            out.push(data)
            callback()
        }
    })
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...