靠谱的同步方法,确保任务之间平滑承接不冲突

最近项目要实现团体报名功能,而每一位报名人员,都要做系列数据审查,并根据特定算法生成二维码字符串,并生成二维码图片保存,并且最后还要把团队所有人的二维码图片集成到一个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); // 间隔时间,可以根据实际每个循环工作量,适当调节,这样过程会更平滑,更节约时间

上面的代码例子,是精简后的示例代码,足以说明这个同步方法的精要了

上一篇:commons-DbUtils组件


下一篇:电脑缺少pdf文件无法打开准考证