在Node.JS中使用迭代进行异步调用

时间:2018-04-29 19:17:57

标签: javascript node.js express async-await iteration

我正在练习练习问题以熟悉Node。我设置了我的应用程序,路由,并且还有一个控制器。

我使用外部API并传入不同的ID,并且(稍后)我想比较传递给我正在编写的api的给定值的响应。所以我迭代了一组id并将它们传递给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);

现在我一直在迭代并插入id。我一直在阅读async / await并进行系列调用。

考虑使用内置的Request库,但我不知道它是否真的有必要。

我尝试根据此stackoverflow answer on iterating over promises

进行此操作

 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的调用是未定义的,所以我对如何在mix中引用带有express的export.findOne函数感到有些困惑。关于迭代的干净解决方案的任何想法? 考虑使用async series或类似的东西:

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

但是我一直在实施旧解决方案,如果有一种简单的方法,我不想再次走错路。谢谢!

资源:

async best practices

callback vs promise vs asyncwait

1 个答案:

答案 0 :(得分:0)

从节点8.4开始,我强烈建议使用本机async / await。 不再需要库,干净的代码易于调试和跟踪堆栈跟踪。没有更多的蓝鸟,但你仍然可以使用promisses同步功能,如fs和rimraf等......