打字稿中的同步和异步代码

时间:2019-10-12 23:09:08

标签: typescript

我是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;
}

1 个答案:

答案 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

并且数组为空,因为数据还不存在。