Как остановить цикл до получения ответа в jquery?

У меня такой код. Длина петли больше 100.

$('.check_box_ping:checked').each(function(i, obj) {
    $.post(
        "mass_ping.php",
        "ping", 
        function(response) {
        }
    );
});

Теперь вызовы 100 $. Post() происходят одновременно. Я хочу выполнить каждый $. Post() последовательно после получения ответа от предыдущего $. Post() с сервера.

0
nl ja de
каждый запрос вызывает 10 завиток на сервере. так что займите 30 лет. если я отправлю 100 данных в atime, это займет 100 * 30 секунд. который повесит мой сервер
добавлено автор E-ebola virus, источник
нет, сэр. пожалуйста помогите
добавлено автор E-ebola virus, источник
Вы действительно не должны отправлять 100 запросов ajax одновременно или нет.
добавлено автор gdoron, источник
Похоже, вы делаете что-то неправильно. ужасно неправильно.
добавлено автор gdoron, источник
100 * (1 + 10) = 1100 запросов. Я не очень беспокоюсь о том, чтобы повесить сервер, как повесить интернет.
добавлено автор Beetroot-Beetroot, источник

3 ответы

С отложенным объектом вы могли бы связать все ваши вызовы ajax, возвращая обещание внутри некоторых цепочечных методов pipe() (см. Вывод на консоль ниже)

Разметка и JS

<body>
    <input type="checkbox" checked />
    <input type="checkbox" checked />
    <input type="checkbox" checked />
    <input type="checkbox" checked />  
</body>

<script src="http://code.jquery.com/jquery-1.8.3.min.js"></script>
<script>
function doRequest() {
    return $.post("script.php").done(function(response) {
       console.log('Loaded in %d seconds', response);
    });
}

$(document).ready(function(){

    var dfd   = $.Deferred(),
        chain = dfd;

    $('input:checked').each(function() {
        chain = chain.pipe(function() {
            return doRequest().promise();
        });
    });

    chain.done(function() { 
       console.log('done')
    });

    return dfd.resolve();
});
</script>

<Сильный> script.php

<?php
   $seconds = rand(2, 5); 
   sleep($seconds);
   header("Content-type: text/html");
   echo($seconds);
?>

Sleep() was used only to emulate a random latency on the response. On the JavaScript console you should see something like this:

output

6
добавлено

Единственный способ приостановить цикл для каждого из них - сделать синхронный пост, который, как правило, очень плохой пользовательский интерфейс (он висит в браузере).

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

(function() {

    var checked = $('.check_box_ping:checked');
    var index = 0;

    function next() {
        if (index < checked.length ) {
            var item = checked.eq(index++);
           //use item here for your post
            $.post({...}, function(response) {
               //do your normal handling of the response here
                ...
               //now kick off the next iteration of the loop
                next();
            });
        }
    }
    next();

})();
2
добавлено

Вы можете сделать 2 вещи

  1. Измените свой код, чтобы вы вызывали следующий post из функции возврата вашего первого сообщения. Это потребует некоторого изменения в вашем текущем цикле, но будет держать все в рабочем состоянии бесперебойно
  2. быстрее, но грязно, это сделать сообщение синхронным. Вы можете узнать, как в этом вопросе: как сделать jQuery "$ .post "синхронный запрос . Я бы советовал об этом, так как это повредило бы вашу страницу во время загрузки.
1
добавлено
каждый запрос вызывает 10 завиток на сервере. так что займите 30 лет. если я отправлю 100 данных в atime, это займет 100 * 30 секунд. который повесит мой сервер
добавлено автор E-ebola virus, источник
Я бы посоветовал ничего не говорить об этом. Он должен отправить все данные по одному запросу.
добавлено автор gdoron, источник
Чтобы быть ясным: я согласен с @gdoron: похоже, что ваш способ делать вещи структурно ошибочен, поэтому было бы лучше, если бы вам не нужны эти хаки.
добавлено автор Nanne, источник
JavaScript Jobs — чат
JavaScript Jobs — чат
8 336 участник(ов)

JavaScript Jobs — чат для поиска работы и людей Правила оформления: https://teletype.in/@telegram-ru/r1WQe5F1m См. также: @mobile_jobs, @devops_jobs, @nodejs_jobs, @react_js, @angular_ru, @js_ru

JavaScript.ru
JavaScript.ru
7 932 участник(ов)

Сообщество сайта JavaScript.ru в Slack.

pro.js
pro.js
4 675 участник(ов)

Про JavaScript и NodeJS Invite: https://t.me/joinchat/Be4rsT5Rsgq30DHutjxXgA Правила: http://telegra.ph/ru-chat-rules-06-19 Вакансии только с ЗП, не чаще раза в неделю.

Верстка сайтов HTML/CSS/JS/PHP
Верстка сайтов HTML/CSS/JS/PHP
3 439 участник(ов)

Правила группы: напишите !rules в чате. Группа Вк: vk.com/web_structure Freelancer: @web_fl Веб Дизайн: @dev_design Маркетолог: @topmarkening Автор: @M_Boroda

JavaScript — русскоговорящее сообщество
JavaScript — русскоговорящее сообщество
3 269 участник(ов)

Рекомендуем сразу отключить уведомления Правила: https://rudevs.network/ByaMH6un7 См. также: @js_noobs_ru, @nodejs_ru, @typescript_ru, @react_js, @electron_ru Вакансии и поиск работы: @javascript_jobs

JavaScript Noobs — сообщество новичков
JavaScript Noobs — сообщество новичков
2 484 участник(ов)

Чат для новичков

javascript_ru
javascript_ru
915 участник(ов)

Сообщество любителей самого популярного языка программирования в мире. Чат основан в 2009 году. Логи: https://goo.gl/9EOeM7 Поддержка бота: @chat_linker (ссылка на репу внутри) Вам будут интересны @frontend_ru и @css_ru

jsChat
jsChat
603 участник(ов)

Чат посвященный программированию на языке javaScript Перед отправкой ссылки на Ваш контент посоветуйтесь с админом Все ссылки удаляются ботом автоматически

JavaScript for Zombies Chat
JavaScript for Zombies Chat
492 участник(ов)

Чат про JavaScript для настоящих zombie! Вход строго по приглашениям! Ссылка для строгих приглашений: https://t.me/joinchat/AAMBHz3Uyr0tuZ7VaB029g

All That JS
All That JS
417 участник(ов)

JS на русском