Я хочу начать изучать ООП и использовать выборку для получения информации. Но я изо всех сил пытаюсь общаться между классами. Я не могу ПОЛУЧИТЬ информацию в другой класс для дальнейшей обработки.
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.info("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.info(this.data)
11 | }
12 | }
13 |
14 | new Day08();
Затем в моей консоли я получаю это data is not defined
в Day08 в строке 6.
Итак, у меня есть вопрос, как я могу использовать данные, полученные в результате выборки?
Я также пытался написать свой doSomething()
по-другому, например:
doSomething() {
const fetching = new Fetch.fetchData("./Inputs/08-data.txt");
console.info(fetching)
}
Но тогда я также получаю, что данные не определены.
Я не знаю, как получить информацию и использовать ее в другом классе, я пытался поискать ответ в Интернете, но не смог его найти.
Входные данные для выборки каждый раз меняются, чтобы получить разные данные. Вот почему я стараюсь избегать создания класса Fetch со статическим возвратом.
Если бы кто-нибудь мог помочь мне с этим, это было бы здорово.
Похоже, проблема в том, что конструктор Day08 должен иметь параметр данных
constructor(data) {
super(data);
this.doSomething();
}
Если вы хотите иметь возможность использовать данные в других классах, которые вы извлекаете из класса Fetch
, поскольку вызов fetchData
является асинхронным, весь код, который будет использовать данные, должен вызываться после завершения асинхронного вызова асинхронным образом.
class Fetch {
async fetchData(path) {
const res = await fetch(path)
const {
status
} = res;
if (status < 200 || status >= 300) {
return console.info("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.info('Something', this.data)
}
doSomethingElse() {
console.info('Else ', this.data)
}
}
const day = new Day08('https://jsonplaceholder.typicode.com/todos/1')
day.init().then(() => {
day.doSomething();
day.doSomethingElse();
})
Это отлично сработало. Знаете ли вы способ, при котором мне не нужно использовать последние строки кода? Нравится вызов функции в конструкторе?
Возможно, взгляните на этот вопрос и ответьте stackoverflow.com/questions/43431550/…
Моделирование
fetch
как класс имеет довольно большие врожденные проблемы. ООП — это не просто классы, это моделирование через классы. Что вообще делает классFetch
? Он вызываетfetch
и выполняет некоторую обработку. На самом деле он ничем не отличается отfetch.then(/* ... */)
, но он менее гибкий, поскольку вы изолировали промис, что делает класс довольно сложным в использовании. Лучшим дизайном было бы позволить добавить больше кода, который будет обрабатывать разрешенное обещание. Но это то же самое, что.then
. Вместо этого вы можете раскрыть обещание, но тогда зачем нужен класс?