Асинхронные обратные вызовы - PullRequest
6 голосов
/ 21 марта 2012

Я написал функцию, которая делает асинхронный запрос, используя jQuery.

var Site = {

    asyncRequest : function(url, containerId) {        
        $.ajax({
            url : url,
            onSuccess: function(data){
                $(containerId).html(data);
            }
        });
    }
}

Синтаксис может быть немного неправильным, поскольку я использую блокнот, но, надеюсь, вы поняли идею.

Я вызываю функцию:

Site.asyncRequest('someurl', container1);
Site.asyncRequest('someurl', container2);

Оба запроса отправляются и обрабатываются сервером. Два ответа отправляются обратно, чего я и ожидаю. Однако я ожидаю, что container1 и container2 будут содержать ответы на оба запроса.

Проблема в том, что отображается только последний ответ, и я не могу понять, почему. Я не знаю, как jQuery AJAX отслеживает запросы / ответы, так что, возможно, это проблема.

Скажем, я делаю 5 или 10 запросов, как jQuery ajax знает, какой ответ на какой запрос и где он отслеживает?

Спасибо

Ответы [ 2 ]

5 голосов
/ 21 марта 2012

Похоже, что это проблема с Javascript. Попробуйте следующее:

var Site = {
    asyncRequest: function(url, containerId) {
        (function(theContainer) {
            $.ajax({
                url: url,
                onSuccess: function(data) {
                    $(theContainer).html(data);
                }
            });
        })(containerId);
    }
};

Это создает отдельную область для каждого вызова функции, поэтому фактическое значение, на которое указывает theContainer, отличается для каждой анонимной функции onSuccess.

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

То, что здесь происходит, - это создание единственного замыкания из-за способа объявления этой функции.См. «Более сложный пример» здесь: http://skilldrick.co.uk/2010/11/a-brief-introduction-to-closures/

По сути, containerId распределяется между всеми экземплярами этой onSuccess анонимной функции.Я не проверял это, но я полагаю, что если вы определили свою asyncRequest функцию вне Site, это сработало бы.

Что касается более элегантного решения этой проблемы, возможно, кто-то ответитлучше.

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