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)
});
nodejs异步转同步的更多相关文章
- 异步nodejs代码的同步样子写法样例
异步nodejs代码的同步样子写法样例 js的异步嵌套太深代码将不好看.尤其在用node的时候这种情况会大量出现. 这里用node连接redis,做一个用户注册的简单例子来说明.例如用redis做存储 ...
- Nodejs异步异常处理domain
前言 程序开发中,最麻烦的事情之一就是异常处理:对于Nodejs程序开发,最麻烦的事情莫过于异步异常处理. 以MVC的多层架构设计角度,异常总是要一层一层向上抛出,最后在客户端出打印错误.但是,Nod ...
- NodeJS异步I/O解析
在现在的项目开发中,任何一个大型项目绝对不是简简单单的采用一个种语言和一种框架,因为每种语言和框架各有优势,与其死守一个,不与取各家之所长,依次得到一个高性能.搞扩展的产品. 对于一个.NET开发者, ...
- Node.js之路【第三篇】NodeJS异步实现
NodeJS异步实现 Node.js异步编程的直接体现就是回调,它依托于回调来实现,但不能说使用了回调他就是异步了 回调函数在完成任务后就会被调用,Node使用了大量的回调函数,Node所有的API都 ...
- ASP.NET sync over async(异步中同步,什么鬼?)
async/await 是我们在 ASP.NET 应用程序中,写异步代码最常用的两个关键字,使用它俩,我们不需要考虑太多背后的东西,比如异步的原理等等,如果你的 ASP.NET 应用程序是异步到底的, ...
- 入门级的按键驱动——按键驱动笔记之poll机制-异步通知-同步互斥阻塞-定时器防抖
文章对应视频的第12课,第5.6.7.8节. 在这之前还有查询方式的驱动编写,中断方式的驱动编写,这篇文章中暂时没有这些类容.但这篇文章是以这些为基础写的,前面的内容有空补上. 按键驱动——按下按键, ...
- C#中的异步和同步
同步 同步(英语:Synchronization [ˌsɪŋkrənaɪ'zeɪʃn]),指对在一个系统中所发生的事件(event)之间进行协调,在时间上出现一致性与统一化的现象.说白了就是多个任务一 ...
- 漫话JavaScript与异步·第三话——Generator:化异步为同步
一.Promise并非完美 我在上一话中介绍了Promise,这种模式增强了事件订阅机制,很好地解决了控制反转带来的信任问题.硬编码回调执行顺序造成的"回调金字塔"问题,无疑大大提 ...
- C# 异步转同步
当我们的程序运行时,调用了一段异步的逻辑A,这段异步的逻辑无法转化为同步(如动画.下载进度等) 而,我们又需要等待异步逻辑A处理完成,然后再执行其它逻辑B. 那就迫切需要将异步转同步了! //参数bo ...
随机推荐
- ES 14 - (底层原理) Elasticsearch内部如何处理不同type的数据
目录 1 type的作用 2 type的底层数据结构 3 探究type的存储结构 3.1 创建索引并配置映射 3.2 添加数据 3.3 查看存储结构 4 关于type的最佳实践 1 type的作用 在 ...
- 关于 JavaScript 中的继承
ES5 之前,继续是这样实现的 function Parent() { this.foo = function() { console.log('foo'); }; } Parent.prototyp ...
- vue项目,axios请求图片接口,接口返回的是文件流的形式,如何转换成图片?
axios .get('/captcha', { params: param, responseType: 'arraybuffer' }) .then(response => { return ...
- HTML 练习显示隐藏
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- HIVE扩展GIS函数
按项目日益增长的gis数据量要求,需要在大数据集群中部署HIVE的扩展函数. Apache Hive是一个建立在Hadoop架构之上的数据仓库.它能够提供数据的精炼,查询和分析.([引 ...
- SQL Server 动态掩码
介绍 动态数据掩码(DDM)是SQL Server 2016引入的一个新功能.目的就是限制没有权限的人去看到一些隐私信息.管理员用户能够决定哪些字段是需要被掩码的,那么如何在不改变应用程序代码的基础上 ...
- 关于a[i]++和a[i++]说明
1.a[i]++:表示对当前数组元素值自增,此时可以把a[i]简单看做一个变量x,操作后,x的值加1: int main() { ]; ; a[i] = ; a[i]++; printf(" ...
- getopt与getopt_long
如何通过命令行,为程序传入参数,可以使用函数getopt与getopt_long. 函数的声明如下: #include <unistd.h> int getopt(int argc, ch ...
- windows下gitbash安装教程
下载安装 1.从git官网下载一个git安装包,官网下载地址http://www.git-scm.com/download/ 2.双击安装程序,进入欢迎界面点击[Next >] 3.阅读协议,点 ...
- Java使用Try with resources自动关闭资源
Try-with-resources Try-with-resources是Java7中一个新的异常处理机制,它能够很容易地关闭在try-catch语句块中使用的资源. 利用Try-Catch-Fin ...