Я хочу создать новый объект из данных, полученных другим объектом в вызове jQuery getJSON. Я обнаружил объекты обещания, и я думал, что смогу использовать их для достижения этого. Вот моя реализация:Создавать объект после getJSON
function HeadlineList(url) {
this.url = url;
this.checkEmpty = function() {
if (this.quantity === 0) {
this.refreshContent();
}
};
this.getRandom = function(remove) {
var headlineNumber = Math.floor(Math.random()*this.quantity);
var headlinePick = this.list[headlineNumber];
if (remove) {
this.deleteHeadline(headlineNumber);
}
return headline;
};
this.getHeadline = function(number, remove) {
var headlinePick = this.list[number]
if (remove) {
this.deleteHeadline(number);
}
return headline;
};
this.deleteHeadline = function(number) {
this.list.splice(number, 1);
this.quantity -= 1;
};
this.fillFromJSON = function(data) {
this.list = data.headlines;
this.quantity = this.list.length;
};
// Here's where I create the promise object. 'response' is globally
// scoped so my other objects can get to it.
this.refreshContent = function() {
response = $.when($.getJSON(this.url, this.fillFromJSON));
};
this.refreshContent();
}
Когда HeadlineList
экземпляра объекта, он извлекает данные с помощью getJSON. Этот запрос AJAX хранится в глобальной переменной response
, поэтому я могу убедиться, что это будет сделано позже. После этого я хочу, чтобы создавался другой объект, но данные зависят от того, правильно ли он создан. Я попытался использовать метод done
response
, чтобы выполнить это.
Класс в вопросе:
function Headline(object) {
this.title = object.title;
this.url = object.url;
this.onion = object.onion;
this.isOnion = function(){
return this.onion;
}
}
И экземпляр класса после инстанцирования HeadlineList
объекта:
// headlines is an instance of HeadlineList with the URL of my JSON file.
// It should (and does) make the request when instantiated.
headlines = new HeadlineList('js/headlines.json');
// Instantiating the headline after the AJAX request is done. Passing
// a random headline from the HeadlineList object to the constructor.
response.done(function() {
headline = new Headline(headlines.getRandom(true));
});
Я смотрел на вкладке Chrome DevTools сети, чтобы убедиться, что нет ничего неправильно с файлом JSON. Он дает ответ 200 и проверяет в JSON linter. Свойство list
объекта headlines
должно содержать данные из файла, но оно всегда не определено. Программа попадает исключение на этой линии внутри getRandom
метода headlines
объекта:
var headlinePick = this.list[headlineNumber];
Исключение составляет Uncaught TypeError: Cannot read property 'NaN' of undefined
.
Я не уверен, где проблема в точности или куда идти отсюда. Любое руководство будет высоко оценено.
Или более просто 'ответ = $ .when ($ getJSON (this.url, this.fillFromJSON.bind (это)).);' – bmceldowney
Это была проблема. Спасибо вам обоим! – raddevon