具有异步请求的NodeJS

特罗曼人

我正在经历对于Node JS初学者和异步请求来说似乎是一个传统问题。

用户生成的URL数量未知,然后存储在Node JS服务器上的数组中。Node JS服务器必须遍历这些URL,依次向每个URL发出请求。它必须按顺序进行,并且必须等待每个响应,然后才能移至下一个URL(将发出新请求时)。最终结果应该是所有响应(碰巧是JSON)的有序集合,很好地存储为JSON对象,然后可以在准备好时将其发送回客户端。

我认为我应该使用asyncNodeJS库,并且已经在needle用于发出请求。

URLs = ["http://a", "http://s", "http://d"];
async.eachSeries(URLs, function (URL, callback) { ..... });

我不清楚如何使用异步来确保Needle请求已完成,并在移动到下一个URL请求之前相应地存储该响应。以下是我的Needle请求的示例。

 needle.get(URL, options, function(error, response, body){ ... });

欢迎部分或全部解决整个问题。

柏拉图

这里有两个示例,一个示例用一个保存一个结果,另一个示例async.eachSeries收集所有结果async.mapSeries然后一次保存所有结果

URLs = ["http://a", "http://s", "http://d"];
function iterator1(URL, done){
  var options = {};
  needle.get(URL, options, function(error, response, body){ 
    if(error){ return done(error) };
    processAndSaveInDB(body, function(err){
      if(err){ return done(err) };
      done(null);
    });
  });
};

async.eachSeries(URLs
, iterator1
, function (err){
  // global callback for async.eachSeries
  if(err){ 
    console.log(err) 
  } else {
    console.log('All Needle requests successful and saved');
  }
});

// Here is a similar technique using async.map, it may be more suitable
function iterator2(URL, done){
  var options = {};
  needle.get(URL, options, function(error, response, body){ 
    if(error){ return done(error) };
    done(null, body);
  });
};

async.mapSeries(URLs
, iterator2
, function (err, results){
  // global callback for async.mapSeries
  if(err){ 
    console.log(err) 
  } else {
    console.log('All Needle requests successful');
    // results is a 1 to 1 mapping in order of URLs > needle.body
    processAndSaveAllInDB(results, function(err){
      if(err){ return done(err) };
      console.log('All Needle requests saved');
      done(null);
    });
  }
});

我不清楚如何使用异步来确保Needle请求已完成,并在移动到下一个URL请求之前相应地存储该响应。

series异步函数变体可以解决这个问题。您只需确保done在准备好继续之前不要调用迭代器函数回调。在实践中,这意味着将调用done置于您最里面的回调中(例如,Needle回调)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

具有异步请求的递归函数

来自分类Dev

具有异步网络请求的ReactiveCocoa排序

来自分类Dev

AngularJS:具有异步请求的多个依赖服务

来自分类Dev

具有异步功能的JavaScript数组

来自分类Dev

具有异步结构的openxml

来自分类Dev

具有异步功能的OracleCommand ExecuteNonQuery

来自分类Dev

具有异步功能的装饰器

来自分类Dev

具有异步功能的意外令牌

来自分类Dev

具有异步/等待的递归setTimeout

来自分类Dev

具有异步/等待的递归setTimeout

来自分类Dev

具有异步/等待的递归setTimeout

来自分类Dev

具有异步方法的RxJava for循环?

来自分类Dev

具有异步QFileSystemModel的Qt异步显示

来自分类Dev

具有异步委托的异步函数的命名约定

来自分类Dev

完成所有异步Http请求后执行功能

来自分类Dev

返回带有异步请求的布尔值

来自分类Dev

带有异步动作的useReducer发出API请求

来自分类Dev

完成所有异步Http请求后执行功能

来自分类Dev

NodeJS等待所有异步命令完成

来自分类Dev

NodeJS中没有异步功能的等待如何工作?

来自分类Dev

具有异步计算的Scala不变性(Akka)

来自分类Dev

具有异步功能的非阻塞I / O

来自分类Dev

具有异步和等待的MVC动作

来自分类Dev

具有异步块的串行调度队列

来自分类Dev

ios快速解析:具有异步结果的方法

来自分类Dev

具有异步关闭变量的结构函数

来自分类Dev

具有异步操作的std :: function回调

来自分类Dev

订阅具有异步功能的可观察序列

来自分类Dev

制作具有异步构造函数的对象数组