![](/img/trans.png)
[英]How could I use Promise.all in an Async/Await function using try/catch
[英]how could I use async/await for that function?
我正在尝试读取 some.txt 文件和 console.log 一个 object 以及之后的格式化数据,但是我知道如何使用 async/await 来做到这一点。 我试过了,但后来得到了错误“ SyntaxError: Unexpected reserved word ”
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)
您的嵌套回调不是async
的(注意:以下代码段仅说明了此特定问题的解决方案,但完整的解决方案将在下面):
let parse = (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', async (err, data) => {
if(err){
console.log(err)
}
await test(obj, 'data', data)
});
};
这就是你得到SyntaxError
的原因。
为了使整个 function async
,您必须摆脱回调样式fs.readFile()
。 您可以使用fs.promises
(我认为从 Node 10 开始可用):
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'];
try {
const data = await fs.promises.readFile('./data txt/' + files[num], 'utf8')
return await test(obj, 'data', data)
} catch (err) {
console.log(err);
}
};
或者如果你不能使用这个新的 API,你可以使用util.promisify()
:
const readFileAsync = require('util').promisify(fs.readFile);
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'];
try {
const data = await readFileAsync('./data txt/' + files[num], 'utf8')
return await test(obj, 'data', data)
} catch (err) {
console.log(err);
}
};
或者,如果您觉得精明(不要),您可以自己承诺 function 并使用原始Promise
:
let parse = (num) => new Promise((resolve, reject) => {
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)
}
resolve(test(obj, 'data', data));
});
});
您可以将Promise
fs.readFile
,然后resolve
或reject
结果。
将对parse()
的调用包装在匿名异步 function 中,以便能够使用await
。
const 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'];
return new Promise((resolve, reject) => {
fs.readFile('./data txt/' + files[num], 'utf8', (err, data) => {
if (err) {
return reject(err);
}
return resolve(test(obj, 'data', data));
});
})
};
(async function() {
const obj = await parse(0); // need to end so that console.log() catch the new obj
console.log(obj)
}());
/*
// using thenables
parse(0).then((obj) => console.log(obj));
*/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.