JQuery .each () цикл, усекающий последнее значение - PullRequest
0 голосов
/ 06 января 2012

У меня есть меню выбора, в котором включен множественный выбор.У меня установлен обработчик события click для кнопки отправки, так что jQuery просматривает каждое выбранное выпадающее значение и выполняет вызов ajax.Работает нормально, за исключением самого последнего значения;последнее значение в списке, кажется, никогда не доходит до вызова ajax, и если выбран только один элемент, то никаких действий не происходит.Любая помощь будет принята с благодарностью.

Вот мой код:

$("#add_members").click(function () {
    var members = $("#project_members").val();

    jQuery.each(members, function () {
        var projectid = <? php echo $project_id; ?> ;
        var member = this[0];

        $.post([url], {
            project_id: projectid,
            user_id: member
        }, function (data) {
            alert(data);
        });
    });

    location.reload();
});

Ответы [ 3 ]

2 голосов
/ 06 января 2012

Вот простой пример работы с $ .each и выбором: http://jsfiddle.net/7fhee/

Скорее всего, проблема заключается в том, что вы ожидаете завершения вызова ajax до вызова location.reload (), которыйВероятно, не собирается быть таковым.Чтобы решить эту проблему, вы должны выполнить location.reload () при успешном обратном вызове ваших вызовов ajax.

2 голосов
/ 06 января 2012

Краткий ответ: у вас гоночная ситуация.

Более длинный ответ: проблема, которую вы получаете, заключается в том, что, хотя .each является синхронным - это означает, что все элементы, повторяемые каждой командой, выполняются перед вызовом location.reload(). Однако .post является асинхронным - это означает, что вы не можете гарантировать, что все сообщения вернулись до выхода из каждого цикла!

1 голос
/ 06 января 2012

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

Попробуйте установить свой ajax не асинхронным, используя $ .ajaxSetup

    jQuery.ajaxSetup({async: false});   //set to false for this method

    $.post([url], {
        project_id: projectid,
            user_id: member
        }, function (data) {
            alert(data);
    });

    jQuery.ajaxSetup({async: true});   //Change it back when done if you so desire

Это должно положить конец вашей гонке.

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