Как сделать переменную delay / sleep в JQuery для каждого цикла - PullRequest
0 голосов
/ 29 мая 2018

Я видел, как многие другие задают вопросы, связанные с этим, но ни один из ответов на самом деле не работает и не относится к моей ситуации.

Я просто хочу реализовать задержку внутри себя для каждого циклапеременной продолжительности времени.Эти переменные длительности происходят из массива, который я зацикливаю при чтении файла json.Чтобы дать дополнительный контекст, цель состоит в том, чтобы выделить каждое слово в предложении на переменное количество времени - каждое слово имеет временную привязку в миллисекундах из файла json.

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

Мой код прямо сейчас:

  $("[id^='timing_check']").click(function() {
    sn = $(this).attr('name');
    ayahnum = $(this).attr('data-id');

    $.getJSON("/static/json/mishary.json", function(result) {
      $.each(result, function(i, v) {
        if (v.ayah == ayahnum && v.surah == sn) {
          var x = v.segments;
          var i = 1;

          x.forEach(function(item) {
            time_sleep = item[3];
            wordref = sn + ':' + ayahnum + ':' + i;
            i++;

            setTimeout(function() {
              $("[name='" + wordref + "']").css('color', 'red');
            }, time_sleep);
          });
        }
      });
    });
  });
});             

Это не работает вообще.Даже не близко.Пожалуйста, предложите некоторое руководство

1 Ответ

0 голосов
/ 29 мая 2018

Я думаю, что проблема заключается в следующем, давайте предположим, что этот код:

array1 = [1000, 2000, 1000, 4000, 10000];
array1.forEach(function(item) { //all actions start at 0

        setTimeout(function() {
            console.log("some action of item "+item);
        }, item);

    }

);

Все setTimeout функция рассчитывается от 0 + элемент время, поэтому времена 1000 и 1000собираются быть выполнены в то же время.Может быть, вы хотите учесть время как item [i1] + item [i2] , тогда вы должны суммировать все время, проведенное в каждой итерации.Код таким образом будет выглядеть примерно так:

array1 = [1000, 2000, 1000, 4000, 10000];

var abs = 0;//beginning 

array1.forEach(function(item) {

        if(!abs){
            abs = item;
        }else{
            abs += item;//sum time spent
        }
        console.log("set "+abs+" to setTimeout");

        setTimeout(function() {
            console.log("some action of item "+item);
        }, +abs);

    }

);

В этом примере 2-е число 1000 будет вычислено после 1000 и 2000, то есть через 4000 мс после запуска цикла.

...