zoukankan      html  css  js  c++  java
  • nodejs异步转同步

    项目在微信环境开发,需要获取access_token进行授权登录和获取用户信息。

    特意把这块功能拿出来封装一个自定义module

    module.exports = new Wechat(con.appid, con.secret, con.url);

    之前appid和secret是在本地配置文件写死的,后来要求系统后台可以配置公众号。

    就需要从后台请求来获取配置参数。这就遇到问题了。

    var wechat = require('./modules/wechat');
    var rule = new schedule.RecurrenceRule();
    //rule.hour = [0,2,4,6,8,10,12,14,16,18,20,22];
    rule.minute = 0;
    var j = schedule.scheduleJob(rule, function(){
    wechat.getBaseTokenForever();
    });
    wechat.getBaseTokenForever();

    我的服务会在开启以及每小时来获取新的access_token,并存入数据库,以保证其是一直有效的,用来控制请求次数不会超额。

    后来模块改为

    var data = {};
        request({
            url: con.url + '/路由',
            method: "POST",
            json: true,
            body: {}
        }, function (err, response, body) {
            if (err || body.code != 0) {
                console.log('获取公众号配置失败 '+ Date());
            } else {
                console.log('获取公众号配置 '+ Date());
                data = body.data;
            }
        });
    
    
    module.exports =  function () {
        return new Wechat(data.appid, data.secret, con.url);
    };

    但是nodejs的异步特效,会导致请求没有完成就执行下面的代码,出现错误。

    经过多方查找,可以使用async模块来异步转同步,只有前一个function执行callback,下一个才会执行。 

    var async = require('async');
    async.waterfall([
        function(callback){
            getWechat();
            function getWechat() {
                if(!wechat().appid){
                    setTimeout(function () {
                        getWechat();
                    },1000);
                    console.log(wechat());
                } else {
                    callback(null,wechat())
                }
            }
        },
        function(wechat, callback){   
        
    var rule = new schedule.RecurrenceRule(); //rule.hour = [0,2,4,6,8,10,12,14,16,18,20,22]; rule.minute = 0; var j = schedule.scheduleJob(rule, function(){ wechat.getBaseTokenForever(); }); wechat.getBaseTokenForever(); callback(null) } ], function(err, results){ console.log(err) });
  • 相关阅读:
    理财技术+人生感悟(转)
    程序员每天每月每年需要做的事(转)
    数据库常用函数(数字函数)
    数据库之常用函数 (日期函数)
    Qt初级-头文件
    Qt初级-成员函数(二)
    Qt初级-成员函数(一)
    Qt初级-Qt格式(二)
    Qt初级-Qt格式(一)
    Qt初级-Qt继承表
  • 原文地址:https://www.cnblogs.com/gxp69/p/8849157.html
Copyright © 2011-2022 走看看