Почему я не могу вызвать функцию изнутри chrome.downloads.onChanged? - PullRequest
0 голосов
/ 10 декабря 2018

Я впервые создаю расширение в chrome (я не веб-разработчик и не разработчик javascript).Я добавляю в кодовую базу, которая находится в более старой версии javascript, которую я никогда не использовал (как только я окажусь на компьютере с этой кодовой базой, я отмечу, какая это версия, но я не могу вспомнить).

У меня есть класс с именем DownloadManager, и внутри него я вызываю chrome.downloads.onChanged , и внутри него я вызываю другую функцию внутри класса, но он не можетузнайте класс (я думаю, что это проблема).

// Class named DownloadManager
function DownloadManager(someData) {

    this._myData = someData;

    // function that does a thing, and tests run successfully
    this.doAThing = function(someData) {
        // Code in here that we assume works, and there's no issues.
    }

    if(chrome.downloads) {
        chrome.downloads.onChanged.addListener(function(delta) {
            // Error here
            this.doAThing(delta.data);
        }
    }
}

Ошибка, которую я получаю, находится в строке this.doAThing(this._myData);.Ошибка: Error in event handler for downloads.onChanged: TypeError: Cannot read property 'doAThing' of null at <URL>.

Я предполагаю, что это проблема с областью видимости, и this. ничего не значит там, и там нет доступа к doAThing.Я уверен, что принятый аргумент того же типа, что и функция, объявленная выше.

Я добавлю больше данных, когда вернусь в эту среду.

1 Ответ

0 голосов
/ 10 декабря 2018

Внутри вашего обработчика событий для chrome.downloads.onChanged ключевое слово this теперь имеет контекст, отличный от this внутри DownloadManager.Возможно, имеет смысл, что, поскольку вы определили обработчик события в downloadManager, вы можете совместно использовать переменную, но это просто совпадение «где код был определен с тем, откуда код вызывается».

Возможно, вам не помешает присвоить this переменной в основной области видимости:

function DownloadManager(someData) {
    this.doAThing = function(someData) {
        // Code in here that we assume works, and there's no issues.
    }

    window.myScope = this;

    if(chrome.downloads) {
        chrome.downloads.onChanged.addListener(function(delta) {
            // Error here
            window.myScope.doAThing(delta.data);
        }
    }
}
...