【问题标题】:Why it cannot read the file?为什么它无法读取文件?
【发布时间】:2020-01-02 18:31:56
【问题描述】:

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

预运行异步
POST 运行异步
POST 异步结果:
结束
INSIDE FILE3 readFile 回调函数...
该脚本不打印文件 FILE3 的内容;问题出在哪里?我对承诺/异步/等待感到困惑!我正在使用 nodejs 和 typescript。

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");

预期的输出应该是:

预运行异步
POST 运行异步
POST asyncResult:
--> 这里是 FILE3 的内容 结束
INSIDE FILE3 readFile回调函数...

注意:我正在尝试使用 nodejs 和 typscript 来理解 promise/await/async;谁能告诉我从哪里开始?有很多例子的好简单的教程?谢谢。

【问题讨论】:

    标签: typescript asynchronous promise async-await


    【解决方案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
    }
    

    【讨论】:

    • 感谢 Lyth;但我很困惑......带有 async 关键字的函数是否可以与返回 Promises 的函数互换?那么为什么我必须在带有 async 关键字的函数中创建一个 Promise 呢?
    • @Yellow75 这只是因为fs.readFile 使用回调约定。这也有包装器,例如参见promisify answer
    猜你喜欢
    • 2014-02-13
    • 2020-09-09
    • 1970-01-01
    • 1970-01-01
    • 2020-08-11
    • 2021-04-01
    • 2023-03-18
    • 2021-08-23
    • 2011-10-24
    相关资源
    最近更新 更多