Подтвердить что ты не робот

Возвращаемый массив из d3.json()

Как JQUERY/d3-noob, кажется, я не могу понять, как это сделать:

  supdog = d3.json(dataPath, function(jsondata){
    return jsondata;
  })
  console.log(supdog);

Спасибо заранее.

4b9b3361

Ответ 1

Помимо того, что описание проблемы очень кратки, проблема заключается в ваших предположениях относительно того, что возвращается.

Функция d3.json() - это асинхронная функция, которая возвращает непосредственно (со значением undefined, которое я предполагаю). Только когда данные будут получены от бэкэнд, будет вызвана функция обратного вызова, которую вы передали ей. Очевидно, что здесь здесь разный контекст, и возвращаемое значение вашего обратного вызова не будет автоматически возвращать значение d3.json(так как это уже было возвращено "до" ).

Что вы хотите сделать, вероятно, что-то вроде:

    var jsondata;
    d3.json(dataPath, function(dataFromServer) {
      jsondata = dataFromServer;
    }
    console.log(jsondata);

Обновление 1: Очевидно, что приведенный выше пример все еще не совсем корректен. Вызов console.log() выполняется сразу после возврата d3.json(). Таким образом, сервер, возможно, еще не отправил ответ. Таким образом, вы можете получать доступ только к данным, когда возвращается обратный вызов. Исправленный пример:

    var jsondata;

    function doSomethingWithData() {
      console.log(jsondata);
    }

    d3.json(dataPath, function(dataFromServer) {
      jsondata = dataFromServer;
      doSomethingWithData();
    })

Для (несколько глупых, но) рабочих примеров см.: http://jsfiddle.net/GhpBt/10/

Обновление 2: Вышеприведенный пример демонстрирует, в каком порядке выполняется код, но на самом деле не заслуживает цены за самый красивый код. Я сам не буду использовать эту "глобальную" переменную и упростить приведенный выше пример:

    function doSomethingWithData(jsondata) {
      console.log(jsondata);
    }

    d3.json(dataPath, doSomethingWithData);

Обратите внимание, как doSomethingWithData передается непосредственно d3.json вместо вызова его отдельно в анонимной внутренней функции.

Примечание: Это не особая проблема d3.js. В принципе, все функции javascript, которые являются асинхронными, могут вести себя аналогичным образом. Если они что-то возвращают, это не будет возвращаемое значение пройденного обратного вызова.

Ответ 2

Я знаю, что это очень старый пост, но я столкнулся с аналогичной проблемой в последнее время и нашел следующее решение, которое стоит обсудить:

В моем случае синтаксис файла JSON был сломан. По умолчанию в этом случае ошибки не появляются в браузере, если вы не улучшите функцию, предложенную @BertjanBroeksema, с обработкой ошибок. Что-то вроде этого:

function doSomethingWithData(error, jsondata) {
  console.log("error:", error)
  console.log(jsondata);
}

Таким образом вы увидите, что что-то не так с обработкой файла JSON.