nodejs非同步轉同步

Jade_g發表於2018-04-15

專案在微信環境開發,需要獲取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) });

 

相關文章