Асинхронный вызов с итерацией в Node.JS - PullRequest
0 голосов
/ 29 апреля 2018

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

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

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

/**
 * 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 с помощью express в смеси. Есть идеи по чистому решению для итерации? Учитывая использование асинхронной серии или что-то вроде этого:

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

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

Ресурсы:

Асинхронные лучшие практики

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

1 Ответ

0 голосов
/ 29 апреля 2018

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

...