Получить переменную из обратного вызова метода объекта javascript - PullRequest
0 голосов
/ 06 марта 2012

В моем коде мне нужно вызвать метод объекта, извлечь данные из его обратного вызова и передать его другому методу или функции.

someObject.getSomeData({option1:'value1', option2:'value2'},
    function(data) {
        doAwesomeStuff(data);
    }
);

Однако обратный вызов не распознает никаких функций / объектов/ переменные вне его области действия.

То, что я пытался сделать сейчас, - это обернуть все вокруг функции.

var myData = '';
(function(myData) {
    someObject.getSomeData({option1:'value1', option2:'value2'},
        function(data) {
            myData = data;
        }
    );
});
doAwesomeStuff(myData);

Однако это тоже не работает.

Кто-нибудь знает, как это правильно сделать?

Ответы [ 3 ]

3 голосов
/ 06 марта 2012

Вы на самом деле не дали нам достаточно, чтобы продолжить, но это утверждение:

Однако обратный вызов не распознает никаких функций / объектов / переменных за пределами своей области.

... неверно.Функция имеет доступ ко всему в области видимости, где она определена, например:

var a = 10;
function foo(b) {
    bar(5);
    function bar(c) {
        alert(a + b + c);
    }
}
foo(12); // alerts "27"

Обратите внимание, как bar имел доступ не только к c, но и к b (от вызова кfoo) и a (из самой внешней области видимости).

Итак, в вашем примере анонимная функция, которую вы передаете в качестве обратного вызова, имеет доступ ко всему, что находится в области видимости, где она определена;doAwesomeStuff будучи определенным в другом месте, предположительно имеет доступ к различной информации, поэтому вам потребуется обратный вызов для передачи ему любых необходимых ему данных.

Так что я предполагаю, что ваш код выглядит примерно так:

function doAwesomeStuff(data) {
    // ...
}

function doSomethingNifty() {
    var a = 10,
        b = 20;
    someObject.getSomeData({option1:'value1', option2:'value2'},
        function(data) {
            doAwesomeStuff(data);
        }
    );
}

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

1 голос
/ 06 марта 2012

Ваш первый метод:

someObject.getSomeData({option1:'value1', option2:'value2'},
    function(data) {
        doAwesomeStuff(data);
    }
);

выглядит хорошо.Пожалуйста, предоставьте более подробную информацию о том, что не работает.

Одной из проблем может быть то, что getSomeData() фактически не вызывает функцию обратного вызова.

doAwesomeStuff() может изменять множество различных переменных из полученных данных.,Переменные, к которым doAwesomeStuff() может получить доступ, - это те, которые были ему доступны (в scope ), где он был создан.

1 голос
/ 06 марта 2012

Вы можете связать необходимые переменные с функцией, переданной в асинхронный метод.

Кроме того, этот вопрос SO хорошо трактует тему.

Ваша вторая версия вообще не будет работать, так как вы пытаетесь немедленно получить доступ к данным, которые еще не доступны (только после обратного вызова).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...