Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Получить объект из closure (https://javascript.ru/forum/misc/20855-poluchit-obekt-iz-closure.html)

Smoker 20.08.2011 04:19

Получить объект из closure
 
this.getEvent = function()
{
    $.post('getEvent', {}, function(response)
    {
        // response
    }, 'json');

    // Как тут получить response?
}

Ну или как написать правильнее?

Использовать глобальные переменные я не хочу, писать нужный код прямо в этот callback я вроде не могу: я теряю возможность обращаться к методам/свойствам текущего объекта.

Gvozd 20.08.2011 04:33

вот ваш код пояснением:
this.getEvent = function()
{
    $.post('getEvent', {}, function(response)
    {
        // response
        // этот код выполнится ПЗЖЕ нижеследующего кода
    }, 'json');

    // Как тут получить response?
    // а никак. потому что этот код выоплнится РАНЬШЕ, чем код в колбеке
}

а вот, для того чтобы не потерять текущий контекст(не терять возможность обращаться к методам/свойствам текущего объекта)
надо писать зАмкание:
this.getEvent = function()
{
var _this = this;
(function(){
    $.post('getEvent', {}, function(response)
    {
        // response
        // Как тут получить response?
        //а он тут доступен. как и _this
    }, 'json');
})();
}

Smoker 20.08.2011 04:37

Почему код в callback выполнится позже? Там какой-то setTimeout?

Так можно, да, только чё-то уродливо выглядит.

systemiv 20.08.2011 04:41

Функция callback выполняется по факту получения какого либо ответа.

Smoker 20.08.2011 04:42

Цитата:

Сообщение от systemiv (Сообщение 121438)
Функция callback выполняется по факту получения какого либо ответа.

Это понятно, но я так понял, что запрос выполняется не сразу.

B@rmaley.e><e 20.08.2011 11:08

Цитата:

Сообщение от Smoker
запрос выполняется не сразу.

Запрос выполняется сразу, но глупо ждать его завершения, когда можно посчитать что-нибудь ещё.

melky 20.08.2011 11:49

Цитата:

Сообщение от Smoker (Сообщение 121437)
Так можно, да, только чё-то уродливо выглядит.

полезней не найдешь. а что уродливо - хз хз. этот трюк использует большинство проггеров, для сохранения контекста

Smoker 20.08.2011 12:07

Okay, спасибо.

P.S. Я имел в виду, что JS же однопоточный язык, я думал, что и с запросами так же. Получается, что сам запрос выполняется в отдельном потоке.
P.P.S. А, я кажется понял разницу асинхронного/синхронного запросов.

Smoker 25.08.2011 06:51

BTW, более удобный способ представлен тут: http://habrahabr.ru/blogs/javascript/103760/ через apply и Function.prototype.


Часовой пояс GMT +3, время: 05:54.