Javascript 如何使用async/await实现该函数?
我试图读取一些.txt文件和console.log文件,然后用格式化数据记录一个对象,但idk知道如何使用async/await实现这一点。我尝试了这一点,但却出现了错误“语法错误:意外的保留字”Javascript 如何使用async/await实现该函数?,javascript,object,async-await,Javascript,Object,Async Await,我试图读取一些.txt文件和console.log文件,然后用格式化数据记录一个对象,但idk知道如何使用async/await实现这一点。我尝试了这一点,但却出现了错误“语法错误:意外的保留字” 您可以将fs.readFile的回调包装在Promise中,然后resolve或reject结果 在匿名异步函数中包装对parse()的调用,以便能够使用wait const parse=async(num)=>{ 让文件=['p.txt','q.txt','r.txt','s.txt','t.txt
您可以将
fs.readFile
的回调包装在Promise
中,然后resolve
或reject
结果
在匿名异步函数中包装对parse()
的调用,以便能够使用wait
const parse=async(num)=>{
让文件=['p.txt','q.txt','r.txt','s.txt','t.txt','u.txt','v.txt','w.txt','x.txt','z.txt'];
返回新承诺((解决、拒绝)=>{
fs.readFile('./data txt/'+files[num],'utf8',(err,data)=>{
如果(错误){
退货拒绝(err);
}
返回解析(测试(obj,‘数据’,数据));
});
})
};
(异步函数(){
const obj=await parse(0);//需要结束,以便console.log()捕获新的obj
控制台日志(obj)
}());
/*
//使用表格
解析(0)。然后((obj)=>console.log(obj));
*/
您的嵌套回调不是异步的(注意:以下代码片段仅说明了此特定问题的解决方案,但完整解决方案如下):
let parse=(num)=>{
让文件=['p.txt','q.txt','r.txt','s.txt','t.txt','u.txt','v.txt','w.txt','x.txt','z.txt'];
fs.readFile('./data txt/'+files[num],'utf8',async(err,data)=>{
如果(错误){
console.log(错误)
}
等待测试(obj,‘数据’,数据)
});
};
这就是为什么会出现SyntaxError
为了使整个函数异步
,必须去掉回调样式fs.readFile()
。您可以使用fs.promises
(我想从节点10开始提供):
let parse=async(num)=>{
让文件=['p.txt','q.txt','r.txt','s.txt','t.txt','u.txt','v.txt','w.txt','x.txt','z.txt'];
试一试{
const data=wait fs.promises.readFile('./data txt/'+files[num],'utf8')
返回等待测试(obj,‘数据’,数据)
}捕捉(错误){
控制台日志(err);
}
};
或者,如果不能使用此新API,可以使用util.promisify()
:
const readFileAsync=require('util').promisify(fs.readFile);
让parse=async(num)=>{
让文件=['p.txt','q.txt','r.txt','s.txt','t.txt','u.txt','v.txt','w.txt','x.txt','z.txt'];
试一试{
const data=await readFileAsync('./data txt/'+files[num],'utf8')
返回等待测试(obj,‘数据’,数据)
}捕捉(错误){
控制台日志(err);
}
};
或者,如果您觉得有悟性(不要!),您可以自己使用原始的Promise
:
let parse=(num)=>新承诺((解析,拒绝)=>{
让文件=['p.txt','q.txt','r.txt','s.txt','t.txt','u.txt','v.txt','w.txt','x.txt','z.txt'];
fs.readFile('./data txt/'+files[num],'utf8',(err,data)=>{
如果(错误){
console.log(错误)
}
解析(测试(obj,‘数据’,数据));
});
});
您必须在async
函数中使用wait
——嵌套不算数,它必须是同一个函数本身。无论如何,我不认为async
可以帮助您实现这一点。最好返回承诺并使用解析(数据)
,如图所示。然后调用方可以等待承诺(或使用。然后)。这将不起作用,因为您没有解析对解析(0)
的调用。我试图不接触不相关的代码。在异步函数或解析(0)中需要等待解析(0)
。然后((结果)=>…)
请注意,在try
块之外使用数据
将不起作用,尽管这只是复制了原始代码中已经存在的问题。我建议不要尝试在parse
中处理文件系统错误。@Bergi补充说,第一个代码片段只是说明了SyntaxError
的原因,您不应该感到理解;)
let parse = async(num) =>{
let files = ['p.txt', 'q.txt', 'r.txt', 's.txt', 't.txt', 'u.txt', 'v.txt', 'w.txt', 'x.txt', 'z.txt'];
fs.readFile('./data txt/' + files[num], 'utf8', (err, data) => {
if(err){
console.log(err)
}
await test(obj, 'data', data)
});
};
parse(0); // need to end so that console.log() catch the new obj
console.log(obj)