【问题标题】:How to use fetch in OOP?如何在 OOP 中使用 fetch?
【发布时间】:2020-12-10 11:34:19
【问题描述】:

我想开始学习 OOP 并使用 fetch 来获取信息。但是我在班级之间的交流方面很挣扎。我无法将信息获取到另一个类以进行进一步处理。

我的代码

Fetch.js

class Fetch  {
    constructor(data) {
        this.data = data;
    }

    async fetchData(path) {
        const res =  await fetch(path)
        const { status } = res;
        if (status <  200  || status >=  300) {
            return  console.log("Oh-Oh! Seite konnte nicht gefunden werden: " + status)
        }
        this.data = res.text();
    }
}

export  default Fetch;

Day08.js

1  | import Fetch from "./Fetch.js";
2  | 
3  | class Day08 extends Fetch  {
4  |    constructor() {
5  |        super(data);
6  |        this.doSomething();
7  |    }
8  | 
9  |   doSomething() {
10 |    console.log(this.data)
11 |    }
12 | }
13 | 
14 | new Day08();

在我的控制台中,我在第 6 行第 8 天得到 data is not defined

问题

所以我的问题是,我如何使用从获取中获得的数据? 我还尝试以不同的方式写我的doSomething(),如下所示:

doSomething() {
    const fetching =  new  Fetch.fetchData("./Inputs/08-data.txt");
    console.log(fetching)
}

但是我也得到那个数据没有定义。 我不知道如何获取这些信息并在不同的课程中使用它,我试图在网上四处寻找答案,但找不到答案。
每次获取的输入都会改变,以获取不同的数据。这就是为什么我试图避免使用静态返回来创建我的 Fetch 类。 如果有人能帮我解决这个问题,那就太好了。

【问题讨论】:

  • fetch 建模为一个类有相当大的固有问题。 OOP 不仅仅是有类,它是关于通过类建模的东西。 Fetch 类甚至可以做什么?它调用fetch 并进行一些处理。它与fetch.then(/* ... */) 确实没有什么不同,但它的灵活性较低,因为您已经隔离了承诺,这使得该类相当难以使​​用。更好的设计是允许添加更多代码来处理已解决的承诺。但这与.then 相同。您可以改为公开承诺,但是,为什么要开设课程?

标签: javascript class oop fetch


【解决方案1】:

如果您希望能够使用从 Fetch 类中获取的其他类中的数据,而不是因为 fetchData 调用是异步的,则必须在异步之后调用所有将使用数据的代码调用以异步方式完成。

class Fetch {
  async fetchData(path) {
    const res = await fetch(path)

    const {
      status
    } = res;

    if (status < 200 || status >= 300) {
      return console.log("Oh-Oh! Seite konnte nicht gefunden werden: " + status)
    }

    this.data = await res.text();
  }
}

class Day08 extends Fetch {
  constructor(path) {
    super()
    this.path = path;
  }

  async init() {
    await this.fetchData(this.path);
  }

  doSomething() {
    console.log('Something', this.data)
  }

  doSomethingElse() {
    console.log('Else ', this.data)
  }
}

const day = new Day08('https://jsonplaceholder.typicode.com/todos/1')

day.init().then(() => {
  day.doSomething();
  day.doSomethingElse();
})

【讨论】:

【解决方案2】:

似乎问题是 Day08 的构造函数必须具有 data 参数

constructor(data) {
   super(data);
   this.doSomething();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-27
    • 2021-03-20
    • 1970-01-01
    相关资源
    最近更新 更多