现在我需要用Nodejs抓取一个网站上面的数据,数据可能有几千条,分几十页,而且每一页都是一次请求,现在我需要对外部提供一个接口,就是可以一次返回这几千条数据的接口。 问题是是获取页数之后循环请求,但是返回的数据在每次请求的回调函数里,我该怎么把这些回调函数里面的数据汇总到一起并返回给调用接口啊?
用 eventproxy
使用计数器. 你要分发多少个处理函数,就要对每一个完成的回调函数进行计数判断: function check () { nums–; if (nums === 0) { // do something. } }
每一个回调函数中都使用这个检测函数来进行逻辑监测,以回到下一个进程线 类似于交换机侦听 …(…, function (…) { … check(); });
比如我写的howdo吧,虽然简单,也是可以完成的
var howdow = new Howdo(); // 这是页数,可以顺序也可以是乱序 var pages = [0, 1, 2, 3, 4, ...]; pages.forEach(function(page) { // 分配任务 howdo.task(function(done) { request(page, function(e, result) { // 各种处理之后...,提交任务 done(e, result); }); }); }); // 分页去查询,这些任务之间没有依赖关系 // 各个任务可以一起做 howdo.together(function(e, page0, page1, page2, page3, page4, ...) { // 只要其中1个任务出现错误,都会返回错误 if(e) return callback(e); // 参数顺序和分配任务时的顺序一致 // 这里得到了所有的分页数据 // 然后再拼接返回即可 var data = [].concat.apply([], [].slice.call(arguments, 1)); callback(null, data); });
你可以看一下 async 模块的 map方法 https://github.com/caolan/async#map
CNode 社区为国内最专业的 Node.js 开源技术社区,致力于 Node.js 的技术研究。
用 eventproxy
使用计数器. 你要分发多少个处理函数,就要对每一个完成的回调函数进行计数判断: function check () { nums–; if (nums === 0) { // do something. } }
每一个回调函数中都使用这个检测函数来进行逻辑监测,以回到下一个进程线 类似于交换机侦听 …(…, function (…) { … check(); });
比如我写的howdo吧,虽然简单,也是可以完成的
你可以看一下 async 模块的 map方法 https://github.com/caolan/async#map