Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / асинхронность / 25 сообщений из 34, страница 1 из 2
06.06.2014, 14:18
    #38663607
unname1983
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
асинхронность
Подскажите, уже просто сломали голову. Есть такой кусок скрипта:

Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
    $('#buttonArm').click(function() {
            $('#buttonArm').text("");
            $('#buttonArm').append("<img src='/images/spin.GIF'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Выполнение</img>");
            $.get('control.php',{object : objectz , DoArm : ''});
            document.getElementById('buttonArm').disabled = true;
            for(var i=0;i<10;i++)
            {
                //sleep(500);
                $.ajax({
                    url: "isRunning.php",
                    async: false,
                    type: "POST",
                    data: { object : objectz }
                })
                .done(function(data){
                        //dataz=data;
                       if (data=="0") {
                           location.reload();
                       }
                });
                //if (dataz=="0") location.reload();
            }
        });



То есть смысл такой, что мы посылаем пост запрос скрипту, и если скрипт отвечает ноликом, то перегружаем страницу, на деле все оказывается так:
выполняется сначала десять циклов, а после этого выполняется 10 раз функция done. Это хорошо видно под отладчиком. И соответственно уходит 10 запросов, хотя уже после первого обычно приходит нужный результат. Как сделать что-бы после первого успешного запроса, страница перегружалась? Пробовал отключить асинхронность, такая же фигня.
...
Рейтинг: 0 / 0
06.06.2014, 14:23
    #38663615
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
асинхронность
unname1983Подскажите, уже просто сломали голову.Надо было сначала учебник почитать, а не методом тыка голову ломать.
...
Рейтинг: 0 / 0
06.06.2014, 14:27
    #38663620
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
асинхронность
Вместо цикла нужен рекурсивные вызов POST запроса, если скрипт isRunning.php отвечает не ноликом.
...
Рейтинг: 0 / 0
06.06.2014, 14:56
    #38663670
unname1983
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
асинхронность
skyANA, да спасибо.Сразу разобрался и все написал как надо.
...
Рейтинг: 0 / 0
06.06.2014, 15:03
    #38663692
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
асинхронность
unname1983, не за что, вот мой вариант, если что:
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
<!DOCTYPE HTML>
<html>  
<head>
  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.js"></script>
</head>  
<body>
  <button id="buttonArm">Click me...</button>
  <script>
    var objectz = {};
      
    $('#buttonArm').click(onArmClick);
      
    function askServer() {
      var called = arguments.callee.called || 0, deferred;
        
      if (called == 10) {
        onAskServerAttemptExceeded();
        return;
      }
        
      deferred = $.ajax({ data: { object: objectz }, type: "POST", url: 'demo_test_post.asp' });
      deferred.done(onAskServerDone);
        
      arguments.callee.called = called + 1;
    }
      
    function onArmClick(event) {        
      var sender = $(this);
        
      sender.text('Running...');
      sender.attr('disabled', 'disabled');
        
      askServer();
    }

    function onAskServerAttemptExceeded() {
      alert('The maximum number of attempts is exceeded!');
      location.reload();
    }
      
    function onAskServerDone(data) {        
      if (data == '0') {
        onAskServerSuccess();
      }
      
      askServer();        
    }

    function onAskServerSuccess() {
      location.reload();
    }
  </script>
</body>
</html>

Проверял тут .
...
Рейтинг: 0 / 0
06.06.2014, 15:09
    #38663706
unname1983
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
асинхронность
skyANA, у меня чуток попроще наверное получилось. Единственное нету проверки на количество обращений...

Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
function isRunning()
    {
          $.ajax({
            type: 'POST',
            url: "isRunning.php",
            data: {object : objectz},
            success: function (data){
                if (data==0) location.reload();
                else isRunning();
            },
            error: function () {
                isRunning();
            }
        });
    }

    (function($)  {
        $('#buttonDisArm').click(function() {
            $('#buttonDisArm').text("");
            $('#buttonDisArm').append("<img src='/images/spin.GIF'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Выполнение</img>");
            $.get('control.php',{object : objectz , DoDisarm : ''});
            document.getElementById('buttonDisArm').disabled = true;
            isRunning();
        });
        $('#buttonArm').click(function() {
            $('#buttonArm').text("");
            $('#buttonArm').append("<img src='/images/spin.GIF'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Выполнение</img>");
            $.get('control.php',{object : objectz , DoArm : ''});
            document.getElementById('buttonArm').disabled = true;
            isRunning();
        });



Все верно??? При таком коде какие подводные камни могут встретится???
...
Рейтинг: 0 / 0
06.06.2014, 15:14
    #38663719
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
асинхронность
unname1983, простите, но у Вас не проще. У Вас лапшекод и дублирование.

Какие тут могут быть подводные камни? При таком стиле со временем код невозможно будет сопровождать.
...
Рейтинг: 0 / 0
06.06.2014, 15:54
    #38663800
Програмёр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
асинхронность
unname1983skyANA, у меня чуток попроще наверное получилось. Единственное нету проверки на количество обращений...

Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
function isRunning()
    {
          $.ajax({
            type: 'POST',
            url: "isRunning.php",
            data: {object : objectz},
            success: function (data){
                if (data==0) location.reload();
                else isRunning();
            },
            error: function () {
                isRunning();
            }
        });
    }

    (function($)  {
        $('#buttonDisArm').click(function() {
            $('#buttonDisArm').text("");
            $('#buttonDisArm').append("<img src='/images/spin.GIF'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Выполнение</img>");
            $.get('control.php',{object : objectz , DoDisarm : ''});
            document.getElementById('buttonDisArm').disabled = true;
            isRunning();
        });
        $('#buttonArm').click(function() {
            $('#buttonArm').text("");
            $('#buttonArm').append("<img src='/images/spin.GIF'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Выполнение</img>");
            $.get('control.php',{object : objectz , DoArm : ''});
            document.getElementById('buttonArm').disabled = true;
            isRunning();
        });



Все верно??? При таком коде какие подводные камни могут встретится???

Не знаю почему skyANA не понравился стиль написания... вроде нормально... только функцию isRunning надо переименовать, так как isSomething - это шаблонное имя для функций проверки на принадлежность чего-то к чему-то. Автоматически приходит ассоциация "наверное функция проверяет не запущено ли что-то".
А ещё обязательно objectz сделать аргументом функции :) А то перенесёшь код, забудешь что так сделал и будешь потом отлаживать... ладно 5-10 строк, а если код разрастётся до 100-200?
А ещё видишь как object подсветился... )) При большом количестве "неправильно" подсвеченного кода будет сложно в нём разобраться, потому такие ключи как object, Array, Boolean, instanceof лучше не использовать, или же использовать строго в кавычках (явно давая понять среде разработки что это строки).

Из подводных камней - это рекурсивное зацикливание, а также сокрытие ошибки и попытка выдать её как штатный процесс ожидания выполнения операции.
...
Рейтинг: 0 / 0
06.06.2014, 16:12
    #38663841
unname1983
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
асинхронность
skyANA, и почему же 'лапшекод'???

и вообще что за манера? я культурно интересуюсь...и вместо того чтобы аргументированно ответить, Вы предпочитаете некультурно что-то ляпнуть...даже читать не интересно...
...
Рейтинг: 0 / 0
06.06.2014, 16:13
    #38663845
unname1983
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
асинхронность
Програмёр,

спасибо за совет.


Вот нормальный, развернутый ответ...все понятно и ясно...не то что некоторые отвечают...(ясно в чей огород камень)
...
Рейтинг: 0 / 0
06.06.2014, 16:36
    #38663882
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
асинхронность
unname1983skyANA, и почему же 'лапшекод'???

и вообще что за манера? я культурно интересуюсь...и вместо того чтобы аргументированно ответить, Вы предпочитаете некультурно что-то ляпнуть...даже читать не интересно...Почему не культурно? Я критикую код. Причём начинаю свою критику с "простите, но...".
...
Рейтинг: 0 / 0
06.06.2014, 16:44
    #38663893
unname1983
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
асинхронность
skyANA, критика это хорошо, но обосновать то нужно как то??
...
Рейтинг: 0 / 0
06.06.2014, 16:49
    #38663901
Яростный Меч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
асинхронность
ПрограмёрА ещё видишь как object подсветилсяэто здешний баг подсветки кода
11696509
...
Рейтинг: 0 / 0
06.06.2014, 16:55
    #38663915
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
асинхронность
unname1983, Ваш код не структурирован. Вы используете анонимные обработчики вместо осмысленно названных методов.

Это приведёт к тому, что код превратится в лапшу из вложенных в function() вызовов function() и сложно будет понять, а что он вообще делает.

Сами обработчики "толстые", в них смешана работы с DOM и вызовы сервера. Причём весь код обрабочиков дублируется.
Также Вы дублируете jQuery селекторы и смешиваете два подхода: использование JQuery селекторов и document.getElementById.
...
Рейтинг: 0 / 0
06.06.2014, 16:58
    #38663926
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
асинхронность
unname1983skyANA, критика это хорошо, но обосновать то нужно как то??Я на обед ходил. Обосновал.

P.S.: существуют статические анализаторы кода, например: JSLint. Советую воспользоваться.
...
Рейтинг: 0 / 0
06.06.2014, 17:07
    #38663936
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
асинхронность
Также не понятно, зачем дёргается $.get(). Другой разработчик посмотрит, не поймёт и удалит.
...
Рейтинг: 0 / 0
06.06.2014, 17:44
    #38663991
Малыхин Сергей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
асинхронность
=)
...
Рейтинг: 0 / 0
06.06.2014, 17:58
    #38664000
unname1983
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
асинхронность
skyANA, тот кто разрабатывает поймет, для чего дергается $.get
...
Рейтинг: 0 / 0
06.06.2014, 18:03
    #38664003
unname1983
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
асинхронность
skyANA, и вообще, с первого взгляда, понятнее мой код, чем Ваш. Зачем столько функций? Каждая состоит из 2-3 строк. Картинку же нарисовали...действительно безумие.
Конечно, если передавать это кому то другому, он не поймет ничего, но не из-за того что у меня как то не так написано, а из за того что создана библиотека для работы с ядром, а там действительно черт ногу сломит, но опять же не из за того что криво написано, а из зато того что продукт к которому пишется этот личный кабинет, нереально огромный и нереально сложный.

В любом случае я учту то что Вы сказали. Спасибо за критику :)
...
Рейтинг: 0 / 0
06.06.2014, 18:05
    #38664007
Програмёр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
асинхронность
skyANAunname1983, Ваш код не структурирован. Вы используете анонимные обработчики вместо осмысленно названных методов.

Это приведёт к тому, что код превратится в лапшу из вложенных в function() вызовов function() и сложно будет понять, а что он вообще делает.

Сами обработчики "толстые", в них смешана работы с DOM и вызовы сервера. Причём весь код обрабочиков дублируется.
Также Вы дублируете jQuery селекторы и смешиваете два подхода: использование JQuery селекторов и document.getElementById.

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

2. надо дёрнуть сервер, взять с него текст, по нему выбрать некий пункт в селекте, в зависимости от полученного текста дёрнуть другой сервер и полученным json'ом заполнить другой селект. Ну это к примеру. Получается надо как минимум 4 функции создавать?
А я в этом коде вижу всего несколько строчек кода ))
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
//дёргаю первый сервер
$.ajax({
  type: "post",
  url: "dfsdfsdf.php",
  data: {data: data},
  success: function(answer){
    //выбираю опцию в селекте и дёргаю другой сервер
    $("#myselect").val(answer);
    if(data!=""){
      $.ajax({
        type: "post",
        url: "sdfsdfsdfsd.php",
        dataType: "json",
        success: function(answer){
          //заполняю второй селект нужными опциями
          var options = [];
          for(var val in answer){
            options.push("<option value='"+val+"'>"+answer[val]+"</option>");
          }
          $("#myselect2").html(options.join("\n"));
        }
      });
    }
  }
})



я вот о чём... средняя длина функции не должна составлять 6 строк )) Иначе тогда просто создаётся дефрагментированность кода, и он становится менее понятный и явный.

3. Ну думаю автор создал дублированность кода или по неопытности или в спешке. понятное дело что этот код можно выделить в отдельную функцию, заменив вызовы типа $('#buttonArm') на this. Однако я привык делать немного иначе. Я всёровно создаю анонимную функцию, а саму логику размещаю в именованной, однако в эту именованную функцию я отправляю готовые аргументы. Другими словами само событие (event) я обрабатываю на месте, а вот все действия выполняю в соответствующем методе. Очень часто это является удобно и полезно :)
...
Рейтинг: 0 / 0
06.06.2014, 19:23
    #38664070
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
асинхронность
Малыхин Сергей, гы, а картинка к чему? Намёк на то, что методы надо пересортировать?
...
Рейтинг: 0 / 0
06.06.2014, 19:24
    #38664071
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
асинхронность
А, чёрт, не туда одну стрелку нарисовал
...
Рейтинг: 0 / 0
06.06.2014, 19:27
    #38664073
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
асинхронность
unname1983skyANA, тот кто разрабатывает поймет, для чего дергается $.getА, кстати, для чего?
...
Рейтинг: 0 / 0
06.06.2014, 19:46
    #38664088
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
асинхронность
ПрограмёрskyANAunname1983, Ваш код не структурирован. Вы используете анонимные обработчики вместо осмысленно названных методов.

Это приведёт к тому, что код превратится в лапшу из вложенных в function() вызовов function() и сложно будет понять, а что он вообще делает.

Сами обработчики "толстые", в них смешана работы с DOM и вызовы сервера. Причём весь код обрабочиков дублируется.
Также Вы дублируете jQuery селекторы и смешиваете два подхода: использование JQuery селекторов и document.getElementById.

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

Вон у автора блоком идёт подписка на клики по двум кнопкам. И получается жирный блок инициализации событий.
И каждый раз чтобы посмотреть, что происходит по нажатию на такую-то кнопку, приходится этот блок перечитывать.
Тогда как проще найти метод onЧтоТоТамClick. Особенно в IDE, потому как в IDE выводится список методов и можно быстро перейти к нужному.

Програмёр2. надо дёрнуть сервер, взять с него текст, по нему выбрать некий пункт в селекте, в зависимости от полученного текста дёрнуть другой сервер и полученным json'ом заполнить другой селект. Ну это к примеру. Получается надо как минимум 4 функции создавать?
А я в этом коде вижу всего несколько строчек кода ))
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
//дёргаю первый сервер
$.ajax({
  type: "post",
  url: "dfsdfsdf.php",
  data: {data: data},
  success: function(answer){
    //выбираю опцию в селекте и дёргаю другой сервер
    $("#myselect").val(answer);
    if(data!=""){
      $.ajax({
        type: "post",
        url: "sdfsdfsdfsd.php",
        dataType: "json",
        success: function(answer){
          //заполняю второй селект нужными опциями
          var options = [];
          for(var val in answer){
            options.push("<option value='"+val+"'>"+answer[val]+"</option>");
          }
          $("#myselect2").html(options.join("\n"));
        }
      });
    }
  }
})

О, это яркий пример ниндзя кода. Мощные функции! .

Програмёр3. Ну думаю автор создал дублированность кода или по неопытности или в спешке. понятное дело что этот код можно выделить в отдельную функцию, заменив вызовы типа $('#buttonArm') на this.У него не только селекторы дублируются, у него весь код обработчиков дублируется.

P.S.: хотел бы я кстати знать, какой результат получится если нажать сначала на одну, а потом на другую кнопку.
...
Рейтинг: 0 / 0
06.06.2014, 20:09
    #38664110
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
асинхронность
unname1983skyANA, и вообще, с первого взгляда, понятнее мой код, чем Ваш.Это сейчас Вам понятно, когда Вы его только что написали.

А пройдёт полгода, Вам надо будет посмотреть (или кому-то другому), что происходит при нажатии на кнопку "Arm", и что Вы будете искать? Строку "$('#buttonArm').click(" в тексте?
А я быстро перейду к методу onArmClick.

А когда меня попросят изменить поведение, если произошла ошибка при запросе сервера (ну зачем его повторно опрашивать, нагружать, если он итак не может ответить), то я быстренько найду метод onAskServerError и поменяю его внутренности.
...
Рейтинг: 0 / 0
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / асинхронность / 25 сообщений из 34, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]