Я пытаюсь создать граф с D3, где данные должны быть загружены с контроллера REST. Вот код для узлов, с которыми у меня возникают проблемы:
async function request(partNumber) {
var response = await fetch(restURL + partNumber)
var grafic = await response.text()
return grafic
}
nodes.selectAll("nodeSvg")
.data(d => [d])
.enter()
.append("g")
.attr("transform", function(d) {
return "translate(" + [offsetX + d.x * scale + svgOffsetX, offsetY + d.y * scale + svgOffsetY] + ") scale(0.1 0.1)"; })
.html(async (d) => {
if (d.partNumber === "") {
return "";
}
return await request(d.partNumber);
});
Как вы видите, я создаю поток для данных. Каждая из записей данных имеет partNumber, который мне нужен, чтобы получить строку HTML из RestApi. Эта строка является строкой SVG, которая при жестком кодировании создает изображение в виде узла. Но если я не закодирую это жестко и не запрашиваю его (который фактически дает мне строку, если я устанавливаю точку останова), узлы не создаются. Как я могу решить эту проблему?
Заранее спасибо!
РЕДАКТИРОВАТЬ: я использую D3v5, который добавил Promises, но я не уверен, если и как это может помочь мне
РЕДАКТИРОВАТЬ2: Сделал вопрос более ясным
РЕДАКТИРОВАТЬ3: Я нашел решение, которое позволяет мне добавить svgs после загрузки остальной части графика, что будет лучше, если есть много svgs для загрузки из ОТДЫХ Api. Вот как я это сделал:
async function request(partNumber) {
if (partNumber !== "") {
var response = await fetch(restURL + partNumber)
return await response.text()
}
}
drawing.nodes.forEach((d) => {
if (d.partNumber === "") {
d.graphic = "";
}
request(d.partNumber).then((e) => {
d.graphic = e;
nodes.selectAll("nodeSvg")
.data(d => [d])
.enter()
.append("g")
.attr("transform", function(d) {
return translateNode(d); })
.html((d) => {
return d.graphic
});
});
})
Я только что переместил часть, которая создает узлы, в часть ".then ()". Оказывается, D3 просто обновляет измененные значения вместо того, чтобы перерисовывать его снова и снова, как в al oop.
В любом случае: Спасибо Миккель за ваш ответ!