Как создать событие, срабатывающее после завершения некоторых вызовов ajax? - PullRequest
0 голосов
/ 29 ноября 2010

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

HTML:

<ul id="links">
    <li><a href="1.html">What is Yoda's first name?</a></li>
    <li><a href="2.html">Why does Padme die?</a></li>
    <li><a href="3.html">Who is Darth Rage?</a></li>
</ul>
<div id="content"></div>

JQuery:

$('#links a').each(function (index, el) {
    url = $(el).attr('href');
    $('<div class="article" />').appendTo('#content')
        .load(url, function(){
            filterOneArticle(this);
        });
});

// I want this function run after all articles will be loaded and filtered 
$.bind('yepAllArticlesHaveBeenLoaded', filterAllArticles);

filterAllArticles = function() {};
filterOneArticle = function(el) {};

Ответы [ 3 ]

1 голос
/ 29 ноября 2010

Если по какой-либо причине вы не хотите использовать ajaxStop, как предлагает Ник (возможно, вы беспокоитесь о других, несвязанных ajax-запросах, которые вас отталкивают), вы можете отслеживать, сколько запросов вы отправили, ипроверьте, когда каждый из них преуспевает / терпит неудачу:

var requestCount = 0;
$('#links a').each(function (index, el) {
    url = $(el).attr('href');
    ++requestCount;
    $('<div class="article" />').appendTo('#content')
        .load(url, function(){
            filterOneArticle(this);
            --requestCount;
            if (requestCount == 0) {
                filterAllArticles();
            }
        });
});

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

1 голос
/ 29 ноября 2010

jQuery поддерживает это поведение.вы можете использовать jQuery для выполнения вызова ajax, как показано ниже.этот метод имеет две функции обратного вызова для успеха и неудачи.

function loadData()
{
    $.ajax({
        type: "POST",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        url: 'methodurl',
        success: methodSuccedded,
        error: methodFailure
    });
}

function methodSuccedded()
{}

function methodFailure()
{}
1 голос
/ 29 ноября 2010

Для этого есть глобальное событие ajaxStop:

$(document).ajaxStop(filterAllArticles);

Чтобы отсоединить его, чтобы он не запускался при завершении следующего пакета ajax (если в дальнейшем будет больше активности ajax), вы можете просто вызвать .unbind() в вашем методе filterAllArticles: 1011 *

$(document).unbind("ajaxStop", filterAllArticles);
...