nodejs 异步变同步实战代码

在定时短信提醒项目中,使用nodejs开发,

设计为每10秒轮询一次数据库,获取普通短信提醒。

1、定时器代码:

//定时更新会话,10秒刷新一次
app.use('/___updatesession___', (req, res, next)=>{
   
    //对于普通短信提醒的触发    
    getNormal();

    var resData = {
        errno: 0,
        data: 'success'
    };
    res.send(resData);
});

2、同步开发的普通短信提醒:

var getNormal = co.wrap(function *(){
    var ret = yield pify.promisify(db.get_normal);
    var res = ret[0];
    var data = ret[1];    

    if ((res == false) || (data == 0))
    {
        return;
    }

    for (var i = 0; i < data.length; i++)
    {   
        var content = data[i]["content"];
        var submailprj = data[i]["submailprj"];
        var custom = data[i]["custom"]; 
        var checkstatus = data[i]["checkstatus"];
        var templateid = data[i]["templateid"];
        var mobiles = data[i]["mobiles"];
        var smscnt = data[i]["smscnt"];
        var id = data[i]["id"];
        var userid = data[i]["createuserid"];

        console.log("content:", content);

        if (mobiles == "")
        {
            continue;
        }
        
        //手机号
        var arrMobile = dealMobile(mobiles);
        if (arrMobile.length == 0)
        {
            continue;
        }

        //短信数
        smscnt = dealSmscnt(arrMobile, smscnt);

        console.log("arrMobile:", arrMobile.join(","), "custom:", custom, "checkstatus:", checkstatus, "id:", id);
        
        //发送短信
        if (custom == "1")  //定制类
        {
            if (checkstatus == "2") //审核通过的
            {
                console.log("SendFixedSmsWithPrj: ", arrMobile.join(","), templateid);
            }
            else if (checkstatus == "3")
            {
                //更新为已触发
                yield pify.promisify(id, db.upd_result);
                continue;
            }
            else
            {
                continue;
            }
        }
        else    //非定制
        {
            if ((submailprj == "") || (submailprj == undefined))
            {
                console.log("Send normal:"+ arrMobile.join(","));
            }
            else
            {
                console.log("SendWithPrj: "+ arrMobile.join(",") + content + submailprj);
            }
        }

        var upd = "2";
        var openid = "";
        var weid = "";

        //获取openid
        var oRet = yield pify.promisify(userid, db.get_weidopenid);
        var oRes = oRet[0];
        var oData = oRet[1];
        if ((oRes == false) || (oData == 0))
        {
            continue;
        }

        openid = oData.openid;
        weid = oData.id;
        if ((openid == undefined) || (openid == ""))
        {
            continue;
        }

        var reqData = {
            weid: weid,
            openid: openid,
            upd : upd,
            smscnt: smscnt,
            originalid: id
        };

        //计费
        yield pify.promisify(reqData, db.consume_smscnt);   

        //更新为已触发
        yield pify.promisify(id, db.upd_result);
    }
})

如上,这里核心代码为:

var getNormal = co.wrap(function *(){
    var ret = yield pify.promisify(db.get_normal);
    var oRet = yield pify.promisify(userid, db.get_weidopenid);
    yield pify.promisify(reqData, db.consume_smscnt);
    yield pify.promisify(id, db.upd_result);
}

app.use('/___updatesession___', (req, res, next)=>{
    getNormal();    
}

  即需要用到同步时,用var fn = co.wrap(function *(){ });

  调用时,直接调用fn();即可。

  

  注: 在nodejs中开发最关键的就是这一块,这一块搞明白了,相当于nodejs就完全掌握了,可以开发各种应用了!

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

灰暗角落里的琴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值