Javascript 如何使用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

我试图读取一些.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','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)