Как я могу загрузить файл JSON внутри класса javascript [duplicate]

1

Я попытался загрузить JSON файл внутри класса js. Загруженные данные доступны внутри функции.

 class MakePage {
     constructor() {
        var request=new XMLHttpRequest();
        request.open('GET','daten.json');
        request.responseType='json';
        request.send();
        request.onload=function() {
            this.daten=request.response;
            alert(this.daten[1].Name); // this works
        }       
    }
    test(name) {
        document.getElementById(name).innerHTML=this.daten[1].Name;
    }
}

page=new MakePage();
page.test("xyz"); //  TypeError: this.daten is undefined

Как сохранить загруженные данные в члене класса?

EDIT: Спасибо за ответы. Я попробовал self = this, bind (this) и оператор стрелки, но всегда получаю ту же ошибку TypeReference.

  • 1
    @31piy 31piy this проблема.
  • 0
    @sjahan - Может быть, но даже если вы решите это, код все равно не будет работать, пока не завершится AJAX.
Теги:
class

4 ответа

0

Просто замените функцию обратного вызова функцией стрелки. Когда вы это сделаете:

this.daten=request.response

this не то, что вы думаете.) Использование функции стрелки не изменит значение this и на самом деле это будет то, что вы ожидаете.

class MakePage {
     constructor() {
        var request=new XMLHttpRequest();
        request.open('GET','daten.json');
        request.responseType='json';
        request.send();
        request.onload = () => {
            this.daten=request.response;
            alert(this.daten[1].Name); // this works
        }       
    }
    test(name) {
        document.getElementById(name).innerHTML=this.daten[1].Name;
    }
}

Другой способ сделать это - использовать bind.

    request.onload=function() {
        this.daten=request.response;
        alert(this.daten[1].Name); // this works
    }       
    request.onload = request.onload.bind(this);

И не забудьте прочитать документ, чтобы понять, как он работает под капотом: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this

0

Возможно, вам стоит попытаться заменить

request.onload=function() {
    this.daten=request.response;
    alert(this.daten[1].Name); // this works
} 

функцией стрелки

request.onload=()=> {
    this.daten=request.response;
    alert(this.daten[1].Name); // this works
} 
0

Просто попробуйте со ссылкой на это в функции обратного вызова:

 class MakePage {
     constructor() {
        var request=new XMLHttpRequest();
        request.open('GET','daten.json');
        request.responseType='json';
        request.send();
        self=this;
        request.onload=function() {
            self.daten=request.response;
            alert(self.daten[1].Name); // this works
        }       
    }
    test(name) {
        document.getElementById(name).innerHTML=this.daten[1].Name;
    }
 }
0

this внутри request.onload=function() относится к неправильной области.

Используйте функцию стрелки, например request.onload =() => {} (рекомендуется), или сохраните ссылку на внешнюю область, выполнив const self = this где-нибудь в конструкторе.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню