jQuery $ .each () - проблема - PullRequest
0 голосов
/ 15 мая 2010

я создаю плагин для wordpress, и у меня есть функция, куда я импортирую изображения, это делается с помощью цикла $ .each (), который вызывает функцию .load () - каждую итерацию. Страница функции загрузки, которую вызывает функция загрузки, загружает изображение и возвращает номер. Номер импортируется в span-элемент. Массивы источника и назначения импортируются из LI-elemnts скрытых UL.

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

jQuery(document).ready(function($) {

    $('#mrc_imp_img').click(function(){
    var dstA = [];
    var srcA = [];
    $("#mrc_dst li").each(function() { dstA.push($(this).text()) });
    $("#mrc_src li").each(function() { srcA.push($(this).text()) });

        $.each(srcA, function (i,v) {
            $('#mrc_imgimport span.fc').load('/wp-content/plugins/myplugin/imp.php?num='+i+'&dst='+dstA[i]+'&src='+srcA[i]);
        });

    });


});

Это работает довольно хорошо, но иногда кажется, что функция загрузки не обновляет DOM так быстро, как следовало бы, потому что иногда числа, с которыми обновляется диапазон, меньше, чем предыдущий, и почти каждый раз, когда меньшее число заменяет последний номер в конце. Как я могу предотвратить это и как скрыть '#mrc_imp_img', когда $ .each-loop готов?

Ответы [ 2 ]

1 голос
/ 15 мая 2010

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

jQuery(function($) {
  $('#mrc_imp_img').click(function(){
    var dstList = $("#mrc_dst li");
    var srcList = $("#mrc_src li");
    dstList.each(function(i) { 
      var dst = $(this).text();
      var src = srcList[i].text();
      $.post('/wp-content/plugins/myplugin/imp.php?num='+i+'&dst='+dst+'&src='+src, function() {
        $('#mrc_imgimport span.fc').text($('#mrc_imgimport span.fc').text()+1);
      });
    });
  });
});

(Изменен код, чтобы избежать ненужных операций с массивами, изменен вызов onready для использования сокращения, изменен вызов AJAX для использования POST, который следует использовать для операций, которые изменяют состояние.)

0 голосов
/ 15 мая 2010

Большинство серверов, скорее всего, имеют конечное число запущенных потоков. Если вы выполняете 10 вызовов одновременно, а на вашем сервере только 5 потоков, 5 из них завершатся с ошибкой.

Кроме того - после того, как вы максимизируете все запущенные потоки, другие пользователи не смогут получить доступ к серверу, так что вы, по сути, DOS-сервер.

Если вы не возражаете замедлять его до одного вызова за раз, делайте то, что рекомендовал Tgr, который сериализует вызовы, ожидая, пока каждый вызов не завершится, прежде чем начать следующий.

Я бы предпочел то, что предложил Йода. Что вы можете сделать, это превратить его в один серверный вызов, который обрабатывает весь массив. Если вы действительно хотите обновить клиентскую часть счетчика, один серверный вызов может обновить счетчик в базе данных, а затем второй вызов ajax может опрашивать сервер каждые несколько секунд, чтобы выяснить, где находится счетчик. Очевидно, что гарантированно не будет последовательным, но будет лучше для здоровья вашего сервера. Вы также можете подделать последовательный аспект (если вы на # 3, а следующий вызов дает # 6 - увеличивать его на стороне клиента один за другим)

Поскольку предупреждение не отображается, вероятно, существует ошибка javascript до или в строке предупреждения. Попробуйте использовать firebug и оператор console.log или даже сделайте ставку, пройдитесь по нему с помощью отладчика firebug.

...