обновить график новыми данными

#javascript #d3.js

#javascript #d3.js

Вопрос:

У меня есть список файлов, которые я хочу отобразить по порядку (линейный график), создавая анимацию в виде переходов d3 между ними.

У меня есть функция обновления, которая принимает в качестве входных данных имя файла и переводит текущий линейный график в новый линейный график. Это работает нормально.

Однако теперь я хочу перейти по порядку между пятью разными файлами.

Вот код, который я использую:

 var file_list = ["time1.csv", "time2.csv", "time3.csv", "time4.csv", "time5.csv"];

var num_files = file_list.length;

for (i = 0; i < num_files;   i) {
    setTimeout(setDelay(i), 1000);
}

function setDelay(i) {
  setTimeout(function(){
    update(file_list[i]);
  }, 1000);
}
  

Это переводит мой линейный график, но он сразу переходит от первого (time1.csv) к последнему (time5.csv), пропуская все в середине.

Как я могу выяснить, что происходит не так?

Если я console.log(file_list[i]) в цикле, он выполняет цикл и печатает time1.csv … time5.csv.

Спасибо!

Комментарии:

1. Я думаю, что «цепные переходы» — это то, что вы ищете

Ответ №1:

setDelay Вызывается на каждой итерации, чтобы оценить его по таймауту, вы должны передать объект функции в качестве обратного вызова setTimeout(function() { setDelay(i); }, 1000)

Но ваша логика неверна, почему два setTimeout на итерацию? Все они вызываются сразу после каждой итерации, вы должны setDelay объединить вызовы в цепочку или умножить задержку на индекс итерации.

 var file_list = ["time1.csv", "time2.csv", "time3.csv", "time4.csv", "time5.csv"];

function setDelay() {
    var file = file_list.shift();
    if (file) {
        update(file);
        setTimeout(setDelay, 1000);
    }
}

setDelay();