2013-05-08 5 views
0

Я хочу создать новый объект из данных, полученных другим объектом в вызове 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, поэтому я могу убедиться, что это будет сделано позже. После этого я хочу, чтобы создавался другой объект, но данные зависят от того, правильно ли он создан. Я попытался использовать метод doneresponse, чтобы выполнить это.

Класс в вопросе:

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.

Я не уверен, где проблема в точности или куда идти отсюда. Любое руководство будет высоко оценено.

ответ

2

this не будет означать объект headlines при вызове непосредственно с getJSON.

Try:

this.refreshContent = function() { 
    var self = this; 
    response = $.when($.getJSON(this.url, 
     function(data) { 
     self.fillFromJSON(data); 
     } 
    ); 
}; 
+1

Или более просто 'ответ = $ .when ($ getJSON (this.url, this.fillFromJSON.bind (это)).);' – bmceldowney

+0

Это была проблема. Спасибо вам обоим! – raddevon