如何在nodejs中访问其函数范围之外的局部变量值
how to access a local variable value outside the scope of its function in nodejs
我想比较两个文件的数据,为此,我正在使用 fs 模块读取该文件,但由于我想比较这些值,所以我想将值存储在外部变量中,但是当我do console.log(budget_details) 我在控制台中什么也得不到。请有人帮忙。如果我的方法有误,或者我们不需要在 nodejs 中这样做,请指出我。我是 nodejs 的新手。
import csv from 'csv-parser'
import fs from 'fs';
let budget_details
const budgetProcessing = (budget_file_path) => {
try{
fs.createReadStream(budget_file_path)
.pipe(csv())
.on('data', (row) => {
budget_details = row
})
.on('end', () => {
console.log('CSV file successfully processed');
});
}
catch(error){
console.log(error)
}
}
budgetProcessing('budget.csv')
console.log(budget_details)
您的代码不是异步的。带有函数的 'on' 的任何东西都表明它是事件驱动的。你需要这样的东西:
import csv from 'csv-parser'
import fs from 'fs';
let budget_details
const budgetProcessing = (budget_file_path) => new Promise((resolve, reject) => {
try {
fs.createReadStream(budget_file_path)
.pipe(csv())
.on('data', (row) => {
budget_details = row
})
.on('end', () => {
console.log('CSV file successfully processed');
resolve()
});
} catch (error) {
console.log(error)
reject(error)
}
})
budgetProcessing('budget.csv')
.then(() => console.log(budget_details))
先解释一下为什么没有得到预期的结果,其实和作用域没有关系:
import csv from 'csv-parser'
import fs from 'fs';
let budget_details
const budgetProcessing = (budget_file_path) => {
try{
fs.createReadStream(budget_file_path)
.pipe(csv())
.on('data', (row) => {
budget_details = row
})
.on('end', () => {
console.log('CSV file successfully processed');
});
}
catch(error){
console.log(error)
}
}
budgetProcessing('budget.csv')
console.log(budget_details)
fs.createReadStream
本身并不是完全异步的,但是我们将返回的流通过管道传输到 csv-parser
,它会进行基于事件的解析,所以即使您在 console.log(budget_details)
之前调用 budgetProcessing 流读取很可能尚未运行并且 budget_details
仍未定义。
要解决此问题,您可以将此 console.log(budget_details)
移动到如下设置的位置:
let budget_details
const budgetProcessing = (budget_file_path) => {
try{
fs.createReadStream(budget_file_path)
.pipe(csv())
.on('data', (row) => {
budget_details = row
console.log(budget_details)
})
.on('end', () => {
console.log('CSV file successfully processed');
});
}
catch(error){
console.log(error)
}
}
budgetProcessing('budget.csv')
但是变量本身不会起到任何实际作用,所以您可以这样做:
const budgetProcessing = (budget_file_path, callback) => {
try{
fs.createReadStream(budget_file_path)
.pipe(csv())
.on('data', (row) => {
callback(row)
})
.on('end', () => {
console.log('CSV file successfully processed');
});
}
catch(error){
console.log(error)
}
}
budgetProcessing('budget.csv', (budget_details) => {
console.log(budget_details) // or anything with budget_details
})
最后,我想明确指出,将按照 csv-parser 的文档
中指定的 csv 的每一行调用回调
我想比较两个文件的数据,为此,我正在使用 fs 模块读取该文件,但由于我想比较这些值,所以我想将值存储在外部变量中,但是当我do console.log(budget_details) 我在控制台中什么也得不到。请有人帮忙。如果我的方法有误,或者我们不需要在 nodejs 中这样做,请指出我。我是 nodejs 的新手。
import csv from 'csv-parser'
import fs from 'fs';
let budget_details
const budgetProcessing = (budget_file_path) => {
try{
fs.createReadStream(budget_file_path)
.pipe(csv())
.on('data', (row) => {
budget_details = row
})
.on('end', () => {
console.log('CSV file successfully processed');
});
}
catch(error){
console.log(error)
}
}
budgetProcessing('budget.csv')
console.log(budget_details)
您的代码不是异步的。带有函数的 'on' 的任何东西都表明它是事件驱动的。你需要这样的东西:
import csv from 'csv-parser'
import fs from 'fs';
let budget_details
const budgetProcessing = (budget_file_path) => new Promise((resolve, reject) => {
try {
fs.createReadStream(budget_file_path)
.pipe(csv())
.on('data', (row) => {
budget_details = row
})
.on('end', () => {
console.log('CSV file successfully processed');
resolve()
});
} catch (error) {
console.log(error)
reject(error)
}
})
budgetProcessing('budget.csv')
.then(() => console.log(budget_details))
先解释一下为什么没有得到预期的结果,其实和作用域没有关系:
import csv from 'csv-parser'
import fs from 'fs';
let budget_details
const budgetProcessing = (budget_file_path) => {
try{
fs.createReadStream(budget_file_path)
.pipe(csv())
.on('data', (row) => {
budget_details = row
})
.on('end', () => {
console.log('CSV file successfully processed');
});
}
catch(error){
console.log(error)
}
}
budgetProcessing('budget.csv')
console.log(budget_details)
fs.createReadStream
本身并不是完全异步的,但是我们将返回的流通过管道传输到 csv-parser
,它会进行基于事件的解析,所以即使您在 console.log(budget_details)
之前调用 budgetProcessing 流读取很可能尚未运行并且 budget_details
仍未定义。
要解决此问题,您可以将此 console.log(budget_details)
移动到如下设置的位置:
let budget_details
const budgetProcessing = (budget_file_path) => {
try{
fs.createReadStream(budget_file_path)
.pipe(csv())
.on('data', (row) => {
budget_details = row
console.log(budget_details)
})
.on('end', () => {
console.log('CSV file successfully processed');
});
}
catch(error){
console.log(error)
}
}
budgetProcessing('budget.csv')
但是变量本身不会起到任何实际作用,所以您可以这样做:
const budgetProcessing = (budget_file_path, callback) => {
try{
fs.createReadStream(budget_file_path)
.pipe(csv())
.on('data', (row) => {
callback(row)
})
.on('end', () => {
console.log('CSV file successfully processed');
});
}
catch(error){
console.log(error)
}
}
budgetProcessing('budget.csv', (budget_details) => {
console.log(budget_details) // or anything with budget_details
})
最后,我想明确指出,将按照 csv-parser 的文档
中指定的 csv 的每一行调用回调