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

Асинхронный вызов с итерацией в Node.JS

Я решаю практическую задачу, чтобы познакомиться с Node. Я настроил свое приложение, маршруты и контроллер.

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

Меня постоянно смущают старые примеры и документы... какое-то время я пытался сделать это с помощью промисов, пока не прочитал об асинхронности.

/**
 * Controller
 */

const url = 'api.outsidesite.com';
const http = require('http');
productids = [
  1, 2, 3, 4, 5, 6, 7, 8, 9
];

const options = {
  hostname: url,
  path: '/v1/items/${productid}?format=json&apiKey=${apiKey}',
  method: 'GET',
  timeout: 10000
};


exports.findOne = (request, response) => {
  const req = http.request(options, res => {
    res.on('data', chunk => {
      response.send(chunk);
    });
  });
  req.on('error', e => {
    console.error(e);
  });
  req.end();
};

в моем маршрутизаторе я вызываю findOne следующим образом:

  app.get('api/products/findone/:value', products.findOne);

Теперь я застрял в повторении и вставке идентификаторов. Я читал об async/await и выполнял вызовы последовательно.

Думал об использовании встроенной библиотеки Request, но не знаю, действительно ли это необходимо.

Я попытался сделать это на основе этого ответа stackoverflow на повторение обещаний

 const fetchProductDetails = productids => {
   return productids.reduce(function(promise, product) {
     return promise.then(function() {
       return findOne.done(function(res) {
         console.log(res);
       });
     });
   }, Promise.resolve());
 };

 fetchProductDetails(productids).then(function() {
   console.log('all done');
 });

но потом я понял, что ответу было 4 года, и, вероятно, сейчас есть лучший способ сделать это. Кроме того, вызов findOne был неопределенным, поэтому я немного запутался в том, как ссылаться на функцию export.findOne с выражением в миксе. Любые идеи о чистом решении для итерации? Рассмотрите возможность использования асинхронного ряда или что-то вроде этого:

getAll = () =>
  async.reduce(
productids,
0,
function(memo, item, callback) {
  // pointless async:
  process.nextTick(products.findOne());
},
function(err, result) {
  console.log(err);
}
  );

но я продолжаю внедрять старые решения и не хочу снова идти по неправильному пути, если есть простой способ сделать это. Спасибо!

Ресурсы:

рекомендации по асинхронности

обратный вызов, обещание и асинхронное ожидание


  • Обратите внимание, что async/await по-прежнему промисы. Это просто сахар для then звонков. 29.04.2018
  • Я пытался сделать это с помощью Promises, пока не прочитал об асинхронности — вы имеете в виду синтаксис async/await или библиотеку async.js? Обратите внимание, что promise намного современнее, чем asnyc lib. 29.04.2018
  • @Bergi Я имею в виду синтаксис, сначала я увлекся библиотекой, но потом понял, что она интегрирована в сам Node. Я просто хочу попробовать что-то сделать с последним синтаксисом с помощью async/await 29.04.2018

Ответы:


1

Начиная с узла 8.4 я настоятельно рекомендую использовать собственный async/await. Библиотеки больше не нужны, а чистый код легко отлаживать и отслеживать трассировку стека. Bluebird больше нет, но вы по-прежнему можете использовать обещания для функций синхронизации, таких как fs, rimraf и т. д.

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

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

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

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

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

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

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

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