Javascript 使用node.js中的异步等待函数读取csv文件。由于在承诺解决之前执行而未定义
我正在用Node读取文件,过程分为4步。每个步骤都必须等待它调用的函数的解析。这似乎是一项非常简单的任务,但异步函数并不等待其变量定义的结果(即,即使变量“finish”依赖于等待异步函数的变量processData,它也会启动 如果我的结论不正确,我猜我对基本行为的理解很差。我知道有很多线程都有这个问题,但我希望能得到一些帮助。哦,如果我将fs.readFile方法的结果记录在其回调中,数据就会显示出来。但是数据是从该块返回的,没有定义。代码下:Javascript 使用node.js中的异步等待函数读取csv文件。由于在承诺解决之前执行而未定义,javascript,node.js,asynchronous,promise,async-await,Javascript,Node.js,Asynchronous,Promise,Async Await,我正在用Node读取文件,过程分为4步。每个步骤都必须等待它调用的函数的解析。这似乎是一项非常简单的任务,但异步函数并不等待其变量定义的结果(即,即使变量“finish”依赖于等待异步函数的变量processData,它也会启动 如果我的结论不正确,我猜我对基本行为的理解很差。我知道有很多线程都有这个问题,但我希望能得到一些帮助。哦,如果我将fs.readFile方法的结果记录在其回调中,数据就会显示出来。但是数据是从该块返回的,没有定义。代码下: async function formatDa
async function formatData(){
const processData = await getFiles()
const finish = await printData(processData)
}
async function getFiles(){
const checkFile = await getFileData('./csvs/checkfile_for_node_test.csv')
const scheduleFile = await getFileData('./csvs/schedules_for_node_test.csv')
console.log('returning files')
return {checks: checkFile, schedules: schedFile}
}
async function getFileData(file){
const fileData = await fs.readFile(file, (err, data) => data )
console.log(`file data: ${fileData}`)
return fileData
}
function printData(data){
console.log(data)
return data
}
formatData()
我不知道您提供的代码是否是实际代码,但似乎有很多问题,我会逐一为您细分:
formatData
时,应在其前面使用wait
关键字,因为它是一种async
方法
getFiles
方法的最后一行,您错误地放置了scheduleFile
而不是scheduleFile
fs.readFile
与await一起使用。它不能以这种方式工作。您必须提示它或使用readFileSync
async function formatData(){
const processData = await getFiles()
const finish = await printData(processData)
}
async function getFiles(){
const checkFile = await getFileData('./csvs/checkfile_for_node_test.csv')
const scheduleFile = await getFileData('./csvs/schedules_for_node_test.csv')
console.log('returning files')
return {checks: checkFile, schedules: scheduleFile}
}
async function getFileData(file){
const readFileAsync = promisify(fs.readFile);
const fileData = await readFileAsync(file, { encoding: 'utf-8' });
console.log(`file data: ${fileData}`)
return fileData
}
function printData(data){
console.log(data)
return data
}
window.addEventListener('load', async function () {
await formatData();
});
我希望它能起作用。我不知道您提供的代码是否是实际代码,但似乎存在很多问题。我将为您逐一细分:
formatData
时,应在其前面使用wait
关键字,因为它是一种async
方法
getFiles
方法的最后一行,您错误地放置了scheduleFile
而不是scheduleFile
fs.readFile
与await一起使用。它不能以这种方式工作。您必须提示它或使用readFileSync
async function formatData(){
const processData = await getFiles()
const finish = await printData(processData)
}
async function getFiles(){
const checkFile = await getFileData('./csvs/checkfile_for_node_test.csv')
const scheduleFile = await getFileData('./csvs/schedules_for_node_test.csv')
console.log('returning files')
return {checks: checkFile, schedules: scheduleFile}
}
async function getFileData(file){
const readFileAsync = promisify(fs.readFile);
const fileData = await readFileAsync(file, { encoding: 'utf-8' });
console.log(`file data: ${fileData}`)
return fileData
}
function printData(data){
console.log(data)
return data
}
window.addEventListener('load', async function () {
await formatData();
});
我希望它能工作。我相信您缺少getFileData函数的承诺。下面是修改后的代码
const fs = require("fs");
async function formatData() {
const processData = await getFiles();
const finish = await printData(processData);
console.log(finish);
}
async function getFiles() {
const checkFile = await getFileData("./hello.txt");
const scheduleFile = await getFileData("./world.txt");
console.log("returning files");
return { checks: checkFile, schedules: scheduleFile };
}
async function getFileData(file) {
return new Promise((res, rej) => {
fs.readFile(file, (err, data) => {
if (err) rej(err);
console.log(`file data: ${data}`);
res({ fileData: data });
});
});
return fileData;
}
async function printData(data) {
console.log(data);
return data;
}
formatData();
我相信你错过了getFileData函数的承诺
const fs = require("fs");
async function formatData() {
const processData = await getFiles();
const finish = await printData(processData);
console.log(finish);
}
async function getFiles() {
const checkFile = await getFileData("./hello.txt");
const scheduleFile = await getFileData("./world.txt");
console.log("returning files");
return { checks: checkFile, schedules: scheduleFile };
}
async function getFileData(file) {
return new Promise((res, rej) => {
fs.readFile(file, (err, data) => {
if (err) rej(err);
console.log(`file data: ${data}`);
res({ fileData: data });
});
});
return fileData;
}
async function printData(data) {
console.log(data);
return data;
}
formatData();
您正在
printData
上运行await
,该函数不是async
函数。请将其设置为async并进行检查。您也可以简单地从printData调用中删除async。您使用的是readFile
的函数吗?它看起来不是这样的,在这种情况下,await fs.readFile(…)
不会做你希望做的事。所以你在日志中得到了文件数据:未定义的
,对吗?这是正确的。下面的用户已解决。你正在运行等待
打印数据这不是异步
函数。请将其设为异步并检查。你也可以简单地从printData调用中删除异步。你使用的是等待fs。readFile(…)
不会做你希望做的事。所以你在日志中得到文件数据:未定义的
,对吗?没错。下面的用户已解决。别忘了把解决()
调用else
语句谢谢,@Bergi,我只是在上面的代码中将resolve重命名为res。它仍然不正确吗?不,它不正确。即使出现错误,您仍然在调用控制台.log
和resolve
。不要忘记放置resolve()
调用else
语句谢谢,@Bergi,我只是在上面的代码中将解析重命名为res。它仍然不正确吗?不,它不正确。即使有错误,您仍然在调用控制台.log
和res
语句。4.打印数据
是同步的,没有理由等待解析调用“当您调用formatData
时,您应该使用await
关键字”-不一定,它似乎是顶级调用。更重要的是使用formatData().catch(console.error)处理来自它的错误
.Btw,这是node.js代码,它没有窗口
,也没有加载
事件可监听。4.打印数据
是同步的,没有理由等待
调用“当您调用格式数据
时,您应该使用等待
关键字”-不一定,它似乎是顶级调用。更重要的是使用formatData().catch(console.error)
,处理来自它的错误。顺便说一句,这是node.js代码,它没有窗口
,也没有加载
事件可侦听。