2015-10-23 2 views
0

Так что я отчаянно пытался добиться этого, но у меня больше нет надежды, и я был бы признателен за помощь. Я подведу итог этой идеей несколькими строчками, и я уверен, что вы поймете.за каждый + запрос ajax + задержка

$(".el").each(function(){ 
    console.log("starting"); 
    // $.ajax GET request 
    // console.log($.ajax response) 
    // delay of 3 seconds 
    console.log("finished, moving on."); 
    // next 
}); 

Предполагая, что у нас есть 3 элемента, результат выглядит следующим образом:

starting 
finished, moving on. 
starting 
finished, moving on. 
starting 
finished, moving on. 
XHR finished loading: GET "http://localhost/data.json". 
XHR finished loading: GET "http://localhost/data.json". 
XHR finished loading: GET "http://localhost/data.json". 

Я тону с этими запросами AJAX, и я не могу получить что-нибудь работу. Я хочу, чтобы все это работало асинхронно.

+1

Вы делаете Аньину в '.done()'? Также вы используете 'async'? – Twisty

+0

Да. Написал решение ниже, спасибо, что пытался помочь мне приятель. – user3800799

ответ

0

Я думаю, что со всеми моими попытками я просто усложнил ситуацию больше, чем они. Я отправляю свое решение на случай, если кому-то это понадобится.

$('.el').each(function(i){ 
    setTimeout(function(){ 
     console.log("starting now..",i); 
     $.ajax({ 
      method: "GET", 
      async: false, 
      url: "http://" 
     }) 
     .done(function(msg) { 
      console.log(msg); 
     }); 

     console.log("ended. moving on to next element"); 
    },1000*i); 
}); 
+1

Я прочитал в комментарии здесь, в SO, «НИКОГДА НЕ ИСПОЛЬЗОВАТЬ ASYNC FALSE» – guradio

+0

Вы также читали ПОЧЕМУ? :) Мне любопытно. С другой стороны, какие у меня есть варианты? – user3800799

+1

Синхронный ajax блокирует браузер во время вызова ajax (в этом случае во время всех ваших вызовов ajax), поэтому браузер становится невосприимчивым. Это, как правило, ужасный пользовательский интерфейс и почти никогда не будет использоваться. Кроме того, нельзя использовать JSONP. – jfriend00

1

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

function runIt() { 
    var items = $(".el"); 
    var cntr = 0; 

    function next() { 
     if (cntr < items.length) { 
      console.log("starting now..",cntr); 
      // do something with items.eq(cntr) 
      $.ajax({ 
       method: "GET", 
       async: true, 
       url: "http://..." 
      }).then(function() { 
       console.log("finished, moving on."); 
       ++cntr; 
       setTimeout(next, 3000); 
      }); 
     } 
    } 
    next(); 
} 
+0

Это действительно здорово, спасибо, что придумали этот метод. – user3800799

Смежные вопросы