Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 03.10.2013, 21:08
Интересующийся
Отправить личное сообщение для grego Посмотреть профиль Найти все сообщения от grego
 
Регистрация: 09.01.2012
Сообщений: 26

Синхронное выполнение GM_xmlhttpRequest
Здравствуйте!

Пишу юзер-скрипт для Мозиллы, суть скрипта: есть некий сайт, на сайте темы, алгоритмом нужно последовательно пройти по всем темам и собрать некую информацию. В работе использую функцию GM_xmlhttpRequest из API Greasemonkey.
Собственно столкнулся с проблемой, подозреваю, что проблема крайне известная и заключается в асинхронности xhr, мне нужно чтобы выполнение запросов к каждому топику было синхронным, т. е. посыл/прием запросов был последовательным для каждой темы.

Собственно код функции, которая запускается мнгновенно при переходе на нужну страницу.
function checkAllTopics() {
    var start = 1,
        finish = 10,
        inc = 0,
        baselink = "http://example.com/?id=",
        fullLink = '';
  
    function sendXHR(index, link) { //функция обертка для xhr, с помощью нее я думал сделать запросы синхронными.

      fullLink = link + index;

      GM_xmlhttpRequest({
          method: "GET",
          url: fullLink,
          onload: function(response) {
              console.log("so this is a result of " + start + ", " + response.status); //здесь мы просто выводим айдишник темы и статус ответа сервера
              
              if (response.status == 200)  {
                  inc++; //здесь логика - если ответ сервака ОК, то делаем инкремент счетчика
                  console.log(this.url, response.status); //это еще один проверочный вывод инфы для того, чтобы убедиться в том, как все работает
              }                     
          }
      });
    }

    for (; start <= finish; start++) {
      sendXHR(start, baselink); //здесь организуем цикл-пробег по всем темам.
    }

    console.log(inc);  // а здесь в итоге выводим тот самый счетчик, который покажет нам количество успешных обращений к серверу.    
}

checkAllTopics();


А вот что выводи консоль при выполнении:
Код:
[19:46:44.584] 0 // вывелось значение, которое должно было отобразиться в конце выполнения функции
[19:46:44.849] so this is a result of 11, 200 // здесь мы видим что счетчик цикла почему-то сразу перешел к последнему номеру
[19:46:44.849] http://example.com/?id=1 200
[19:46:45.001] so this is a result of 11, 200
[19:46:45.001] http://example.com/?id=3 200 //запросы отрабатывают непоследовательно 1, 2, 3, а вперемешку.
[19:46:45.063] so this is a result of 11, 200
[19:46:45.063] http://example.com/?id=2 200
[19:46:45.123] so this is a result of 11, 200
[19:46:45.123] http://example.com/?id=5 200
[19:46:45.184] so this is a result of 11, 200
[19:46:45.184] http://example.com/?id=4 200
[19:46:45.245] so this is a result of 11, 200
[19:46:45.245] http://example.com/?id=6 200
[19:46:45.307] so this is a result of 11, 200
[19:46:45.307] http://example.com/?id=8 200
[19:46:45.371] so this is a result of 11, 200
[19:46:45.371] http://example.com/?id=7 200
[19:46:45.433] so this is a result of 11, 200
[19:46:45.433] http://example.com/?id=9 200
[19:46:45.492] so this is a result of 11, 200
[19:46:45.493] http://example.com/?id=10 200
Может кто-нибудь помочь с организацией алгоритма так, чтобы xhr выполнялся последовательно в цикле, один за другим, по возрастанию номера темы, а результат выполнения всей функции выводился в конце?
Заранее благодарю!
Ответить с цитированием
  #2 (permalink)  
Старый 03.10.2013, 21:30
Профессор
Отправить личное сообщение для Яростный Меч Посмотреть профиль Найти все сообщения от Яростный Меч
 
Регистрация: 12.04.2010
Сообщений: 557

примерно так:

function checkAllTopics() {
    var start = 1,
        finish = 10,
        inc = 0,
        baselink = "http://example.com/?id=",
        fullLink = '';
   
    function sendXHR(index, link, callback) { //функция обертка для xhr, с помощью нее я думал сделать запросы синхронными.
 
      fullLink = link + index;
 
      GM_xmlhttpRequest({
          method: "GET",
          url: fullLink,
          onload: function(response) {
              console.log("so this is a result of " + index + ", " + response.status); //здесь мы просто выводим айдишник темы и статус ответа сервера
               
              if (response.status == 200)  {
                  inc++; //здесь логика - если ответ сервака ОК, то делаем инкремент счетчика
                  console.log(this.url, response.status); //это еще один проверочный вывод инфы для того, чтобы убедиться в том, как все работает
              }
              callback();
          }
      });
    }
 
    (function _go() {
       if (start <= finish) {
          sendXHR(start++, baselink, _go);
       } else {
          console.log(inc);  // а здесь в итоге выводим тот самый счетчик, который покажет нам количество успешных обращений к серверу. 
       }
    })();
}
 
checkAllTopics();



обошлись без синхронности
Ответить с цитированием
  #3 (permalink)  
Старый 04.10.2013, 23:17
Интересующийся
Отправить личное сообщение для grego Посмотреть профиль Найти все сообщения от grego
 
Регистрация: 09.01.2012
Сообщений: 26

Спасибо, все замечательно отработало!
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
onclick прервать выполнение функции wgt Events/DOM/Window 4 30.04.2013 20:52
Остановить выполнение функции tsigel jQuery 3 19.12.2012 15:09
Как остановить выполнение яваскрипта ? Serjuk AJAX и COMET 20 17.06.2012 22:32
Как включить синхронное выполнение строк? SkaN Элементы интерфейса 1 26.04.2012 22:28
Пошаговое выполнение кода KamalovRadik jQuery 2 28.10.2011 20:46