TypeError:“FunctionName”在异步和等待期间不是函数

时间:2018-02-05 20:31:03

标签: javascript asynchronous async-await

我是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期间不是一个函数。我无法弄清楚原因。有人可以帮帮我吗? 谢谢。

3 个答案:

答案 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方法,请查看此主题:

Difference between readFile and readFileSync