Я достиг стадии, когда я считаю, что не понимаю правильного обратного вызова событий. Я использую d3.js v5, и моя проблема заключается в следующем.
У меня есть функция, которая анализирует файл TSV и добавляет данные в глобальный массив selectedData
, используя функцию d3.tsv
, которая использует обещания в функции addData
:
//function takes filename and data description to add to the selectedData global variable
function addData(filename, dataDesc) {
d3.tsv(filename, type).then ((data) => {
data.forEach(e => {
var obj = {
Title: dataDesc,
ID: e.ID,
Value: e.Value,
}
selectedData.push(obj);
});
});
}
function type(d) {
d.Value = +d.Value;
}
Теперь я использую эту функцию, чтобы либо добавить один файл данных, либо могу вызывать его несколько раз, чтобы добавить данные из нескольких файлов данных в эту глобальную переменную. Глобальная переменная используется для ряда других функций, но в качестве начала она используется для создания гистограммы.
Для добавления одного файла я хотел бы создать гистограмму после добавления данных в глобальную переменную. Для этого я использую следующую функцию:
//functions adds one data file
function addOneData() {
filename = userfile; //gets the user file name based on <input> element using the FileReader api
dataDesc = document.getElementById('file_title').value; //gets the Descriptive Title of the data
addData(filename, dataDesc); //add data to the global variable of selectedData
drawBarChart(); //draws a grouped bar chart based on the global array of selectedData
}
У меня есть похожая функция, которая циклически перебирает массив из нескольких файлов данных, чтобы добавить их в глобальную переменную с различными filenames
и dataDesc
. Для нескольких файлов я не хочу, чтобы рисование происходило после каждого файла, поэтому функция drawBarChart
не является частью функции addData
.
Теперь моя проблема заключается в том, что функции addData
и drawBarChart
работают асинхронно, и поэтому drawBarChart
запускается задолго до того, как данные добавляются в глобальную переменную selectedData
. Итак, мой вопрос: как я могу сделать это либо синхронно, либо использовать силу обещаний? Я пробовал обещания и async / await, но мне кажется, что я упускаю некоторые ключевые понятия. Любая помощь приветствуется. Спасибо.