我是javascript的新手,并试图了解Async和Await。 这是我编写的代码,它尝试从文件中读取,如果找不到该文件则会拒绝。
async function getFileAsString(path) {
if (!path) {
throw "you need to give a path!"
}
const fileContent = await fileCheck(path);
console.log(fileContent)
}
var fileCheck = function(path) {
return new Promise(function(resolve, reject) {
if (fs.readFileAsync(path, "utf-8")) {
resolve("File found!")
} else {
reject("File not found!!")
}
})
}
我收到一条错误说“TypeError:fileCheck在async和await期间不是一个函数。我无法弄清楚原因。有人可以帮帮我吗? 谢谢。
答案 0 :(得分:2)
您的代码中存在一些问题:
1)
fs.readFileAsync(path, "utf-8")
不存在。只需省略Async
即可。 <{1}}默认为异步。
2)
readFile
如上所述, if(fs.readFile(path, "utf-8"))
是异步的,这意味着它不返回任何内容(= readFile
),而是在某些时候调用传递的回调。所以你要么使用同步版本:
undefined
或者您检入回调:
try {
fs.readFileSync(path, "utf-8")
// ... All fine
} catch(error){
// File corrupted / not existing
}
3)使用函数表达式:
fs.readFile(path, "utf-8", function callback(error, data){
if(error) /*...*/;
});
是一个坏主意,因为它引入了提升问题等等。
var checkFile = function(){}
答案 1 :(得分:2)
使用util.promisify()
包装回调式异步函数fs.readFile()
:
var readFile = util.promisify(fs.readFile);
async function getFileAsString(path) {
// `readFile()` will throw proper error if `path` is invalid
const fileContent = await readFile(path, 'utf-8')
console.log(fileContent)
return fileContent
}
答案 2 :(得分:-2)
前几天我正在这样做,上面有几件事情出错了。尝试这样的事情:
const fs = require('fs');
class FileManager {
async getFileAsString(path) {
if (!path) {
throw "you need to give a path!"
}
const fileContent = await this.fileCheck(path);
console.log(fileContent)
}
fileCheck(path) {
return new Promise(function(resolve, reject) {
fs.readFile(path,'utf8',(err, result) => {
if (err) reject(err);
else resolve(result);
});
})
}
}
// Example usage
const fileManager = new FileManager();
fileManager.getFileAsString('./release.js');
这是一些额外的代码,但把它放在一个类中可以防止上面提到的提升问题。我上周也注意到,当我这样做时,async / await在没有用于课程时表现得很奇怪,不知道那是什么......
还有一个已经执行此操作的readFileSync方法,请查看此主题: