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

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

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

下面是后面补充的、进一步封装成通用同步顺序执行数组任务的方法,尚未实践检验:

/**
 * 数组多任务同步顺序执行方法
 * @param {*} cfg //{do, last, interval}
 */
Array.prototype.syncDo = function (cfg) {
    var idx = 0, list = this;
    var doLoop = setInterval(()=>{
        var p = list[idx];
        if(!p.syncDone){
            p.syncDone = true;
            cfg.do(idx, p, ()=>{
                idx += 1;
                if(idx == list.length){
                    clearInterval(doLoop);
                    cfg.last && cfg.last(list);
                }
            });
        }
    }, cfg.interval || 100); // 间隔时间,可以根据实际每个循环工作量,适当调节,这样过程会更平滑,更节约时间
}

// 调用示例
personList.syncDo({
    interval: 50,
    do: function(idx, dt, resove){
        console.log(idx);
        person.exec_proc(null, proc.createOrder(), dt, (re)=>{
            resove();
        })
    },
    last: function(list){
        tools.createQCodes(list, (msg)=>{ 
            res.json({
                code: msg ? 100 : 200,
                message: msg ? msg : '提交完成'
             });
        });
    }
});

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值