Ваш код использует асинхронный обратный вызов.Это означает, что обработчик события (функция (headers) => {...}
) выполняется при возникновении события (в данном случае headers
).Это происходит асинхронно, в то время как оставшийся скрипт продолжается.
Это означает, что происходит следующее:
- Функция объявлена
- Функция вызывается, так как она возвращаетничего (даже не имеет оператора
return
), undefined
хранится внутри omg
- Вызов
console.log
выполняется - В какой-то момент в будущем событие
headers
сработает и выполнит функцию (headers) => { ... }
Так что, если вам нужны результаты, вам нужно поместить код в обратный вызов или вызвать функцию изнутри, например:
function handleHeaders(headers) {
console.log(headers);
}
function getFields (filePath) {
let results = [];
fs.createReadStream(filePath)
.pipe(csv())
.on('headers', (headers) => {
handleHeaders(headers);
});
}
Альтернатива: Promise
Кроме того, вы можете использовать Promise API , который позволит писать ваш код следующим образом:
(async () => {
function getFields(filePath) {
return new Promise(resolve => {
let results = [];
fs.createReadStream(filePath)
.pipe(csv())
.on('headers', (headers) => {
let values = Object.values(headers);
values.forEach(function (element) {
results.push(element);
});
console.log('I am actually getting results here: ', results);
resolve(results);
});
});
}
const omg = await getFields(thisIsAFilePath)
console.log('This console.log is firing before anything else: ', omg)
})();
Имейте в виду, код также выполняется асинхронно, он просто скрыт в форме Обещаний.