очередь d3.js с несколькими файлами json - PullRequest
0 голосов
/ 07 октября 2018

У меня есть эти грязные и уродливые вызовы json parse (!!), которые я пытаюсь упростить, я надеялся с d3.queue.Первый json используется функцией doFirstChart для создания диаграммы после некоторой базовой типизации.Функция создает диаграмму, а также возвращает некоторые дополнительные данные, которые используются вместе со вторым файлом json и другим определяемым пользователем параметром функцией doSecondChart для создания следующей диаграммы.

    var c = 'someValue'
    d3.json(countryJson, function (data) {
        data.forEach(function (d) {
            d.Country_Num = +d.Country_Num
            d.y = +d.Y
            d.x = +d.X
        });

       dataOut = doFirstChart(data);

        d3.json(salesJson, function (salesData) {
            salesData.forEach(function (d) {
                d.Expt = +d.Expt
                d.x = +d.x
                d.y = +d.y
            });
            doSecondChart(dataOut, salesData, c)
            console.log("Done!!")
        });
    });

Похоже, d3.queue - подходящий инструмент для этих ситуаций, однако мне не удалось заставить его работать даже на упрощенном примере.Например (игнорируя параметр exta c), следующее я надеялся сделать трюк, но, очевидно, я не использую его правильно.

d3.queue()
.defer(d3.json, 'path\to\country\data')
.await(doFirstChart)
.defer(d3.json, 'path\to\sales\data')
.await(doSecondChart)

Я даже не понимаю, что самое простое:

 d3.queue()
 .defer(d3.json, 'path\to\country\data')
 .await(doFirstChart)

Как это работает, пожалуйста?

1 Ответ

0 голосов
/ 07 октября 2018

Использование Отсрочка после await выдает ошибку, измените это:

d3.queue()
  .defer(d3.json, 'path\to\country\data')
  .await(doFirstChart)
  .defer(d3.json, 'path\to\sales\data')
  .await(doSecondChart)

На это:

d3.queue()
  .defer(d3.json, 'path\to\country\data')
  .defer(d3.json, 'path\to\sales\data')
  .await(splitCharts)

Гдефункция splitCharts(err, ...args) имеет вид:

function splitCharts(err, ...charts){
    doFirstChart(charts[0]);
    doSecondChart(charts[1]);
}

Проблема, с которой вы столкнулись, заключалась в использовании defer after и await, и, возможно, ваших параметров функции, когда вы не ожидали (err, ... args) в качестве параметров.

В этом примере будет console.log процесс очереди, поэтому вы можете продолжить свой путь оттуда:

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8">
    <script src="http://d3js.org/d3.v3.min.js"></script>
    <script src="http://d3js.org/topojson.v1.min.js"></script>
    <script src="https://d3js.org/d3-queue.v3.min.js"></script>
</head>
<body>
    <script>
        function doFirstChart(err, ...args) {
            console.log('[FUNC]: ', args);
        }

        d3.queue()
            .defer(d3.json, 'https://gist.githubusercontent.com/GbalsaC/db387adae4e84e999960ef79267ceada/raw/0cf2b08280452c7dbb04f81fafcb304bb841bc36/test1.json')
            .defer(d3.json, 'https://gist.githubusercontent.com/GbalsaC/db387adae4e84e999960ef79267ceada/raw/0cf2b08280452c7dbb04f81fafcb304bb841bc36/test1.json')
            .await(doFirstChart)

    </script>
</body>
</html>

Примечание: Если вы хотите передать пользовательскийДля параметра обратного вызова .await() необходимо определить функцию doFirstChart следующим образом:

function doFirstChart(myParam){
   // Now you'll return an anonymous function as first step
   return (err, ...args) => {
      // Here you'll do your thing, like rendering the data
      console.log('My Param: ', myParam); // Your Custom param
      console.log('[FUNC]: ', args); // As before
   }
}

Итак, теперь вы можете изменить тег <script></script> на:

<script>
    const paramTest = 'Testa Rossa';
    function doFirstChart(myParam) {
        return (err, ...args) => {
         console.log('My Param: ', myParam);
         console.log('[FUNC]: ', args);
        }
    }

    d3.queue()
        .defer(d3.json, 'https://gist.githubusercontent.com/GbalsaC/db387adae4e84e999960ef79267ceada/raw/0cf2b08280452c7dbb04f81fafcb304bb841bc36/test1.json')
        .defer(d3.json, 'https://gist.githubusercontent.com/GbalsaC/db387adae4e84e999960ef79267ceada/raw/0cf2b08280452c7dbb04f81fafcb304bb841bc36/test1.json')
        .await(doFirstChart(paramTest)) // do a first param declaration

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