npm install queuedoqueue_do
========
异步队列同步化,支持递归嵌套
基于nodejs模块封装,同样适用于前端的异步同步化。
#安装
npm install queuedo
web版见:lib/queue_do_webjs.js
#原理和使用
文章见:http://www.html-js.com/?p=1474
支持异步同步化
同步化后成队列后执行回调方法
也可以异步处理队列,同时处理完毕后调用回调方法
具体见代码中的注释
* @param array list 需要处理的数据的数组,作为参数传入handle_func第一个参数。
* @param function handle_func 处理方法,第一个参数为数组的一个元素,第二个参数传入的是下一个loop方法,第三个参数是其loop的context
* @param function next_func 队列处理完毕后调用的方法。
* @param boolen isAsyn 是否异步,如果是true,则不会同步化,可以利用next_func获取处理完毕的信号
#一个例子,递归遍历某个文件夹下所有的图片并压缩到1000宽度。
var fs = require('fs');
var path = require('path');
//源文件
var source = '/Applications/XAMPP/xamppfiles/htdocs/htmljs';
//目标文件
var target = '/Applications/XAMPP/xamppfiles/htdocs/htmljs_temp';
//引入gm做图片处理器
var gm = require('gm');
var imageMagick = gm.subClass({
imageMagick: true
});
var queue_do=require("./queue_do.js")
var walk=function(_path,callback,next_func){
var list=[]
if(fs.existsSync(_path)){
var stat=fs.statSync(_path)
if(stat.isDirectory()){
fs.readdir(_path,function(error,files){
queue_do(files,function(__path,next,context){
walk(_path+"/"+__path,callback,function(){
next.call(context)
})
},function(){
next_func()
})
})
}else{
callback(_path)
next_func()
}
}
}
walk(source,function(list){
console.log(list)
},function(){
console.log("all finish!")
})
几个异步方法的同步化:
下面的例子是同步去请求豆瓣三个api,最后请求完后显示出来的例子。
只是示例,完整程序的一部分,不能运行。
var queuedo=require("queuedo");
var Douban = require("douban");
module.exports = function(req, res) {
var config = {
app_key:"0bb4b9fc67f9b013231e2df537ed1039",
app_secret:"e7434521cb0c70ad",
redirect_uri:"http://localhost:8080/sina_auth_cb",
access_token:req.cookies.token
}
var api = new Douban(config);
var datas=[
]
var functions=[
function(callback){
api.shuo.statuses({
source:config.app_key,
text:"hello nodejs"+Math.random()
},function(error,data){
datas.push({
api:"shuo.statuses",
data:data
});
callback();
});
}, function(callback){
api.shuo.home_timeline({},function(error,data){
datas.push({
api:"shuo.home_timeline",
data:data
})
callback();
});
}, function(callback){
api.shuo.user_timeline({
screen_name:"mier963"
},function(error,data){
datas.push({
api:"shuo.user_timeline",
data:data
})
callback();
});
}];
queuedo(functions,function(func,next,context){
func(function(){
next.call(context);
});
},function(){
res.render("shuo.html",{
data:datas
})
});
}