Nano Hash - криптовалюты, майнинг, программирование

d3.js v5 — Promise.all заменил d3.queue

Я уже некоторое время использую d3.js v4 и узнал, что Майк Босток заменил d3.queue в выпуске v5 собственным объектом JavaScript Promise. Я хотел бы проверить с вами, правильно ли этот код, который я написал, ставит в очередь (асинхронно) эти URL-адреса:

var makeRequest = function() {
    "use strict";

    var bli = [
        "http://stats.oecd.org/sdmx-json/data/BLI2013/all/all",
        "http://stats.oecd.org/sdmx-json/data/BLI2014/all/all",
        "http://stats.oecd.org/sdmx-json/data/BLI2015/all/all",
        "http://stats.oecd.org/sdmx-json/data/BLI2016/all/all",
        "http://stats.oecd.org/sdmx-json/data/BLI/all/all"
    ];

    var promises = [];

    bli.forEach(function(url) {
        promises.push(
            new Promise(function(resolve, reject) {
                d3
                    .json(url)
                    .then(function(response) {
                        resolve(response);
                    })
                    .catch(function(error) {
                        console.log("Error on: " + url + ". Error: " + error);
                        reject(error);
                    });
            })
        );
    });

    Promise.all(promises).then(function(values) {
        console.log(values);
    });
};

makeRequest();

Код, кажется, работает правильно, но является ли это правильным кодом или есть лучший способ (подход наилучшей практики) для организации очереди с помощью Promise.all и d3.js? Правильно ли реализована ошибка перехвата?

28.03.2018

  • Я просто откатил этот вопрос, удалив тег d3v5. Для редактора прочитайте это: meta.stackoverflow.com/a/338840/5768908. Мы проделали большую работу по удалению тега d3v4, и, очевидно, этот процесс начнется снова с этим новым тегом d3v5! Это рекомендуемое действие: вопросы должны иметь только тег d3.js, независимо от версии. Затем, если вопрос относится к данной версии, OP должен указать версию в заголовке или в теле вопроса. 28.03.2018

Ответы:


1

Вы можете значительно упростить этот код: вы не можете использовать new Promise с d3.json, так как d3.json сам создаст промис.

Итак, вы можете просто сделать:

var files = ["data1.json", "data2.json", "data3.json"];
var promises = [];

files.forEach(function(url) {
    promises.push(d3.json(url))
});

Promise.all(promises).then(function(values) {
    console.log(values)
});

Или, если вы увлекаетесь кодовым гольфом, еще короче:

var files = ["data1.json", "data2.json", "data3.json"];

Promise.all(files.map(url => d3.json(url))).then(function(values) {
    console.log(values)
});

Поскольку я не могу использовать файлы JSON в S.O. сниппет, проверьте консоль в этом блоке: https://bl.ocks.org/GerardoFurtado/f08993c9c729b0b3452ef1803ad9dcbf/c4b45c5acce6033085a667cbb7d34203d15de0f0

28.03.2018
  • Превосходно! Но если один URL-адрес выдает ошибку - например, если он не существует - Promise не возвращает результаты из других URL-адресов, даже если они верны (от этого страдают ваш и мой код). Есть ли способ вернуть значения из URL-адресов, которые вернули данные, или функция Promise.all предполагает, что не должно быть никаких ошибок? 28.03.2018
  • @MarcoA.Ferra MarcoA.Ferra Это другая проблема, связанная конкретно с Promise.all() и не связанная с D3. Итак, чтобы ваш вопрос не был слишком широким, я предлагаю вам опубликовать эту проблему как новый вопрос с тегом promise и без тега d3.js. 28.03.2018
  • Я это сделаю. Спасибо за правильный ответ выше. 28.03.2018
  • @MarcoA.Ferra Не беспокойтесь. Существует также тег es6-promise, используйте его вместе с < b>javascript конечно. 28.03.2018
  • @MarcoA.Ferra Для этого вы можете попробовать p-queue github.com/sindresorhus/p-queue 28.03.2018
  • как это будет работать со смесью типов файлов? т.е. json, js, csv... спасибо. 21.10.2020
  • @ v3nt это слишком сложно для ответа в комментарии, я предлагаю вам опубликовать новый вопрос. 22.10.2020

  • 2

    Вот подход с асинхронными функциями ES6 и деструктуризация массива ES6:

    async function chart() {
      const [first, second] = await Promise.all([
        d3.json('data1.json'),
        d3.json('data2.json'),
      ])
      console.log('data2.json :', second)
    }
    
    chart()
    
    17.07.2020

    3

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

    const myData = d3.csv("data.csv", formatterFunction)
    .then(data => /* do whatever*/ )
    
    function formatterFunction(row){
      // do formatting
      return // formatted data
       }

    25.07.2020
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..