流程:
1、一天里按时间(精确到小时)来请求WebHDFS(数据类型是JSON)
利用Promise异步请求
2、将上面所有Promise异步请求包装成数据,投入到Promise.all中
遇到问题:
Promise.all 只会在所有传给他的 Promise 都 resolve 了之后才会 resolve,如果其中的一个 reject 了,那么 Promise.all 后面的 then 就不会被执行,catch 会被执行
这样的话,一旦某个小时的日志请求失败了(reject),那么.then里的操作就没法执行了,如何让 Promise.all 坦然面对失败呢?
解决方案:
Promise.all(promises.map(p => p.catch(() => undefined)));
参考https://zhuanlan.zhihu.com/p/26920718
3、对请求到的日志里的数据,分析、截取、分割操作
1)把结果导入数据库(按项目名、日期、项目id、死链、日志原始链接)
2)拼成html邮件格式(table)
3)整个项目部署到Linux上,设定crontab定时任务,每天发送
我Promise.all的认识
比如你是银行前台,专门给别人办理各种银行业务。有一天有100个人来找你办业务,你有两种选择:
同步操作:让这100个人排好队,一个办完再办下一个。
但这存在一个问题,有的人的业务简单,几分钟搞定,有的人业务复杂,也许还要和沟通上级,耗时几小时都不一定。
所以这样做,你一天都办不完100个人的业务。
异步操作:把写好标号的100张便利贴发给这100个人,让他们再返还给你,你根据便签上写的业务,异步来办理,最后把办理好的结果,按序号排好,给办理人
Promise.all就是你,Promise.all里的任务列表[asyncTask(1),asyncTask(2),asyncTask(3)],是按顺序发起的,由于它们都是异步的,互相之间并不阻塞,每个任务完成时机是不确定的。尽管如此,所有任务结束之后,它们的结果仍然是按顺序地映射到resultList里,这样就能和Promise.all里的任务列表[asyncTask(1),asyncTask(2),asyncTask(3)]一一对应起来