最近项目要实现团体报名功能,而每一位报名人员,都要做系列数据审查,并根据特定算法生成二维码字符串,并生成二维码图片保存,并且最后还要把团队所有人的二维码图片集成到一个pdf文件里,供领队下载打印分发。
实现这个功能的过程种,首先肯定是想到用promise做同步校验、生成二维码,最后生成pdf。可现实非常打脸。。。。。因为过程中不仅要操作数据库,等待返回,还要操作文件读写,等待返回。尝试了很多次,总是会随机出现资源冲突的情况,由此可以看出来,promise所谓的同步,本质上类似多线程并行执行的,并不是纯粹的先后执行的。
最后没办法,只能果断放弃promise,自力更生,自己创造方法。通过测试,利用setInterval实现了一个真正的顺序执行的同步方法。看代码:
var idx = 0;
var tmpLoop = setInterval(()=>{
var p = personList[idx];
if(!p.orderID){
p.orderID = orderID;
// 第一层异步方法,创建订单,需要等待返回订单号、二维码等数据
person.exec_proc(null, proc.createOrder(), p, (re)=>{
p.qcode = re[0].QCode;
p.userIdx = re[0].userIdx;
idx += 1;
// 跳出循环的界限判定,
if(idx == personList.length){
clearInterval(tmpLoop);
// 第二层异步方法,集合所有人员订单信息, 产生二维码并生成pdf图片
tools.createQCodes(personList, (msg)=>{
res.json({
code: msg ? 100 : 200,
message: msg ? msg : '提交完成'
});
});
}
});
}
}, 100); // 间隔时间,可以根据实际每个循环工作量,适当调节,这样过程会更平滑,更节约时间
上面的代码例子,是精简后的示例代码,足以说明这个同步方法的精要了