d3 обещают начать немедленно - не ждет данных - PullRequest
0 голосов
/ 27 августа 2018

Я новичок здесь. У меня проблема с node.js с комбинацией системы шаблонов EJS и библиотеки визуализации D3.js.

файл node.js:

router.post('/foo', function(req, res) {
  fs.unlink('./public/d3.json'); // we delete old data (if exist)
  res.render('foo'); // page render

  //lets suppose that here we request some async data and put them to the array via promises

  let array = []; // our array with data

  Promise.all(array).then(function(all) { //when we download all the necessary data...
    var newArray = JSON.stringify(array);
    fs.writeFile('./public/d3.json', newArray, 'utf-8', function(err) { //we write it to file - so chart file bellow can render it
      if (err) {                                                                        
        console.log('writing public/d3.json file with newArray failure] - ' + err);
      }
      else {
        console.log('public/d3.json file with content of newArray has been created.');
      }
    });
  });
}
module.exports = router;

мой EJS-файл выглядит так:

<html>
<head></head>
<body>
<div class="chart"></div>
<script>
<% include ../public/d3.js %> // d3 library
<% include ../public/d3_chart.js %> // chart render code
</script>
</body>
</html>

файл моего графика выглядит так:

d3.json("../public/d3.json", cb);

function cb(error, data) {
    if (error) {
        console.log(error);
    }
    if (data) { // render chart
    }
}

Но это не работает. Он ничего не отображает - вероятно, файл d3.json не содержит данных, когда шаблон ejs запускает d3_chart.js. Но не стоит ли обещать дождаться данных и затем вывести диаграмму? Иначе какой смысл использовать обещания в d3? Как заставить это работать? Я чувствую, что здесь что-то упустил и мне нужен совет Спасибо.

1 Ответ

0 голосов
/ 28 августа 2018

Это не имеет ничего общего с обещанием на стороне d3, а с тем, как вы обрабатываете запрос на сервере.

На сервере вы настроили некоторый асинхронный процесс для создания ответа, который вы хотите обработать. Обработчик запросов не будет ждать, пока асинхронные процессы будут готовы к созданию ответов.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...