2014-09-06 3 views
1

У меня есть следующий JavaScript Object:неопределенная функция при вызове яваскрипта метода прототипа

var Playlist = function(callback) { 
    $.ajax({ 
     url:'/playlist' 
    }) 
    .done(function(data) { 
     this.html = data; 
     callback({},this); 
    }) 
    .fail(function(err) { 
     callback(err,{}); 
    }); 
}; 

для этого объекта, я объявлен методом прототипа:

Playlist.prototype = { 
    render : function() { 
     $('#main').html(this.html); 
    } 
}; 

теперь, когда я создаю новый объект унд попробуйте вызвать функцию «рендеринга» следующим образом:

function renderPlaylist() { 
    var playlist = new Playlist(function(err, obj) { 
     obj.render(); 
    }); 
} 

renderPlaylist(); 

Я получаю «неопределенное», это не функция ». он, похоже, не знает функцию рендеринга, которую я объявил в прототипе. что мне здесь не хватает? Спасибо за помощь.

+4

'обратного вызова ({}, это),' 'this' не что ты думаешь. См. [JavaScript «это» ключевое слово] (http://stackoverflow.com/questions/3127429/javascript-this-keyword), [документация MDN 'this'] (https://developer.mozilla.org/en-US/ docs/Web/JavaScript/Reference/Operators/this) и [Как работают блокировки JavaScript?] (http://stackoverflow.com/questions/111102/how-do-javascript-closures-work) – Volune

+0

Благодарю вас, вы абсолютно прав. Я изменил свой конструктор. – Hinrich

ответ

1

с помощью Volune, я изменил мой конструктор

var Playlist = function(callback) { 
    var playlist = this; 
    $.ajax({ 
     url:'/mpdplaylist' 
    }) 
    .done(function(data) { 
     playlist.html = data; 
     callback(null,playlist); 
    }) 
    .fail(function(err) { 
     callback(err,{}); 
    }); 
}; 

теперь он работает. Спасибо!!

редактировать: , как Volune указывал, я заменил пустой объект для ошибки с нулем в «сделано» функцию обратного вызова

+1

Если вы используете обратные вызовы так же, как и NodeJS, вы должны сделать callback (null, playlist); '. Таким образом, обратный вызов может более легко проверить, была ли ошибка. – Volune

+0

спасибо, что указал. я изменил код – Hinrich

Смежные вопросы