为什么无法读取文件?

时间:2019-08-29 13:05:43

标签: typescript asynchronous promise async-await

我想编写一个脚本来读取文件并打印一些信息;下面代码的输出是:

  

PRE runAsync
  POST runAsync
  POST asyncResult:
  结束
  INSIDE FILE3 readFile回调函数...
  该脚本不会打印文件FILE3的内容;问题出在哪里?我对promise / async / await感到困惑!我正在使用nodejs和打字稿。

import * as fs from "fs";
const FILE3 = "./sample3.txt";

async function readAsyncFile(FILE3: string): Promise<string> {
  //const orWithVariable = function readPromise() {
  let fileContent: string = "";
  fs.readFile(FILE3, "utf8", (err, data) => {
    console.log("INSIDE FILE3 readFile callback function...");
    if (err) fileContent = "Error reading FILE3";
    else fileContent = data;
  });
  return fileContent;
}

async function runAsync() {
  let asyncResult: string = await readAsyncFile(FILE3);
  console.log("POST asyncResult: " + asyncResult);
}
console.log("PRE runAsync");

runAsync().then(() => {
  console.log("END");
});

console.log("POST runAsync");

预期输出应为:

  

PRE runAsync
  POST runAsync
  POST asyncResult:
->此处FILE3的内容   结束
  INSIDE FILE3 readFile回调函数...

注意:我正在尝试使用nodejs和typscript来理解promise / await / async;有人可以告诉我从哪里开始吗?良好且简单的教程,包含大量示例?谢谢。

1 个答案:

答案 0 :(得分:1)

让我们看一下异步读取:

async function readAsyncFile(FILE3: string): Promise<string> {
    let fileContent: string = "";
    ...
    return fileContent;
}

此函数直接返回一个字符串,但是它应该返回一个promise(我想Typescript应该对此有所警告)。

async function readAsyncFile(FILE3: string): Promise<string> {
    let fileContent = new Promise<string>((resolve, reject) => {
        // code here should resolve(data) or reject(error)
        ...
    })
    return fileContent
}

因此,只需在内部添加fs.readFile并在回调中调用这些函数:

async function readAsyncFile(FILE3: string): Promise<string> {
    const fileContent = new Promise<string>((resolve, reject) => {
        // code here should resolve(data) or reject(error)
        fs.readFile(FILE3, "utf8", (err, data) => {
            console.log("INSIDE FILE3 readFile callback function...");
            if (err) reject("Error reading FILE3");
            else resolve(data);
        });
    })
    return fileContent
}