Почему в View.showComponents передается undefined из класса с fetch?
Есть контроллер, который получает преобразованный результат запроса кастомного класса FileRequest
и передает его в метод класса View
, который отрисовывает компоненты. Почему-то в renderComponents
консоль-лог из конструктора класса, вызываемый в reponse
(new FileRequest
), происходит позже, чем консоль-лог перед View.showComponents
. Почему же так происходит?
import View from "@/pages/app/View";
import FileRequest from "@/Requests/FileRequest";
export default class AppController {
static renderComponents() {
let response = new Promise (function (resolve, reject) {
resolve (new FileRequest('http://localhost:3000', FileRequest.parseToComponents));
})
response.then(results => {
console.log(Object.keys(results));
View.showComponents(results.results);
})
}
}
export default class View {
static showComponents(response) {
response.results.forEach(component => {
document.querySelector('.page__files').append(component.DOM_LINK);
})
}
}
import {FileComponent} from "@components/file/File";
export default class FileRequest {
constructor(url, callback) {
fetch(url)
.then((response) => {
return response.json();
})
.then((results) => {
this.results = callback(results.results);
console.log(this.results);
});
}
static parseToComponents(files) {
let components = [];
files.forEach(file => {
components.push(new FileComponent(file));
})
return components;
}
}
class File {
constructor(file) {
for (let key in file) {
if (key !== 'id' && key !== 'identificator') {
this[key] = file[key];
}
}
}
}
export class FileComponent extends File {
constructor(file) {
super(file);
Object.defineProperty(this, 'DOM_LINK', {
value: document.createElement('div'),
enumerable: false,
configurable: false,
});
this.DOM_LINK.className = 'file';
for (let key in this) {
let element = document.createElement('p');
element.className = `file__${key}`;
element.textContent = `${key}: ${file[key]}`;
this.DOM_LINK.append(element);
}
}
}
Источник: Stack Overflow на русском