2014-10-05 3 views
0

Этот код должен пересекать несколько веб-страниц и находить все ссылки на каждой странице, перечисляя их в консоли по мере их появления, но, похоже, они перечисляют только ссылки с самой последней веб-страницы (fakeURL. ком/735).XMLHttpRequest в For-Loop

Как я могу получить console.log(url); для работы на каждую итерацию, а не только последнюю (т.е. когда i = 735)?

for(i = 0; i <= 735; i += 15) 
{ 
    var xhrs = new XMLHttpRequest(); 
    xhrs.open("get", 'http://fakeURL.com/' + i, true); 
    xhrs.onreadystatechange = function() 
    { 
     if (xhrs.readyState == 4) 
     { 
      $(xhrs.responseText).find('a').each(function() 
      {   
       var url = $(this).attr('href'); 
       console.log(url);            
      }); 
     } 
    } 
     xhrs.send(); 
} 
+3

Вы должны увидеть, что: http://stackoverflow.com/questions/26100329/xhr-response-with-for-loop-not-working/26100409#26100409 BTW, '$' похоже, jQuery, так почему не используете ли вы $ .ajax() '? – laruiss

+0

Ваш код запускает целую кучу аякс-звонков, а затем все они заканчиваются через некоторое время. Какова ваша проблема? – jfriend00

+0

@ jfriend00 Мне нужно, чтобы 'console.log (url)' выполнялся на каждой итерации. Сейчас это происходит только на последней итерации. – Farad

ответ

0

Ваш вопрос в том, что вы повторно использовать один и тот же xhrs переменную для всех ваших Ajax вызовов. Таким образом, все вызовы в игре сразу не могут найти переменную xhrs, которая принадлежит их конкретному запросу при возникновении события . Таким образом, все они смотрят на xhrs.readyState с последнего запроса, так что вы только когда-либо видите последний запрос.

Вы должны быть в состоянии переключиться на использование this ссылаться на запрос, который сгенерировал onreadystatechange событие:

for(i = 0; i <= 735; i += 15) { 
    var xhrs = new XMLHttpRequest(); 
    xhrs.open("get", 'http://fakeURL.com/' + i, true); 
    xhrs.onreadystatechange = function() 
    { 
     if (this.readyState == 4) 
     { 
      $(this.responseText).find('a').each(function() 
      {   
       var url = $(this).attr('href'); 
       console.log(url);            
      }); 
     } 
    } 
    xhrs.send(); 
} 

Как уже говорили другие, если $ указывает на то, что вы используете JQuery, то, скорее всего, jQuery.ajax() быть намного проще.