我是Typescript的新手,正在尝试了解如何更好地构建TS中的代码。
基本上,我计划有一个FileReader类(同步)和一个ApiFileReader类(异步),它们都从Reader类继承。我喜欢ApiFileReader和FileReader都能够将它们的返回值转储到数据变量中,该数据变量可以是字符串或帖子数组,我可以通过调用继承的类的data属性来访问它们。因为一个是同步的而另一个是异步的,那有可能吗?使用Typescript构造此类同步和异步代码的最佳方法是什么?
我尝试了以下构造代码的方法,但这是错误的。在index.ts文件中,apiFileReader.data返回一个空数组,而不是填充有帖子的数组
感谢有Typescript经验的人员可以提供有关此问题的一些指导。预先感谢
Index.ts
import { ApiFileReader } from "./inheritance/ApiFileReader";
//! API FILE READER
const apiFileReader = new ApiFileReader();
apiFileReader.readDataAsync();
console.log(apiFileReader.data); // returns an empty array
ApiFileReader.ts
import axios from "axios";
import { Reader } from "./Reader";
import { Post } from "./types/Post";
export class ApiFileReader extends Reader {
data: Post[] = [];
async readDataAsync(): Promise<boolean> {
try {
const res = await axios.get("https://jsonplaceholder.typicode.com/posts");
console.log("res ", res);
this.data = res.data;
return true;
} catch (error) {
return false;
}
}
logData(): void {}
}
FileReader.ts
import fs from "fs";
import { Reader } from "./Reader";
export class CustomFileReader extends Reader {
data: string = "";
logData(): void {
this.data = fs.readFileSync("note.doc", "utf-8");
}
}
Reader.ts
import { Post } from "./types/Post";
export abstract class Reader {
abstract data: string | Post[];
abstract logData(): void;
}
答案 0 :(得分:0)
因为一个是同步的而另一个是异步的,那有可能吗?使用Typescript构造此类同步和异步代码的最佳方法是什么?
您可以使两个函数异步,以便两个都返回Promise。使用同步代码的函数将返回已解决的Promise,例如return Promise.resolve(your-sync-data)
。
实际上,您甚至不需要这样做,只需使用async
关键字标记同步代码:
async function f() {
return 5; // what actually gets returned: return Promise.resolve(5);
}
f().then(data => console.log(data)); // prints 5
我尝试了以下构造代码的方法,但这是错误的。在index.ts文件中,apiFileReader.data返回一个空数组,而不是填充有帖子的数组
此代码
apiFileReader.readDataAsync();
不等待readDataAsync()
返回的Promise。而不是等待它立即执行
console.log(apiFileReader.data); // returns an empty array
并且数组为空,因为数据还不存在。