setTimeout(f, 0)的应用&利用Deferred实现队列运行
任务:从mongodb中导出csv数据,输出内容如下
userid username usergender pointspoints表:
{ "userid" : 1022, "points" : 12 }
{ "userid" : 2592, "points" : 4 }
{ "userid" : 7304, "points" : 44 }
{ "userid" : 7343, "points" : 40 }
{ "userid" : 7372, "points" : 12 }
{ "userid" : 7376, "points" : 4 }
{ "userid" : 7424, "points" : 20 }
{ "userid" : 7458, "points" : 4 }
{ "userid" : 7481, "points" : 24 }
{ "userid" : 7595, "points" : 4 }//...上万条数据
user表key
userid username usergender points
窃喜,很简单嘛,读取输出。
好,开干。
var points = [ //事先导出来了
{ "userid" : 1022, "points" : 12 },
{ "userid" : 2592, "points" : 4 },
{ "userid" : 7304, "points" : 44 }
]
var saveData = [];
function readData(userid, callback){
db.collection('user').find({userid: userid}).toArray(function(error, data){
if(!error){
callback(data);
} else {
callback({});
}
});
} function write(data){
//file writing...
} var complete = 0;
function run(){
for(var i = 0; i < points.length; i++){
readData(points, function(data){
saveData.push({
userid: data.userid,
username: data.username,
usergender: data.usergender,
points: data.points
});
complete++;
if(complete == points.length){
write(data);
}
});
}
}
run();
结果可想而知,很多数据丢失,而且每次运行的结果都不一样——都是异步惹的祸,一拥而上,不死才怪
怎么让它一步步来呢?用Deferred写了个队列运行
function runQueueTasks(tasks){
var i = 0;
function run() {
if (!tasks[i]) {
return;
}
when(Deferred(tasks[i])).then(function() {
//run(); // May caught an RangeError: Maximum call stack size exceeded
setTimeout(run, 0); // ←nextTick ↑recursion
});
i++;
}
run();
}
搞定,收工。
其中有一句setTimeout(run, 0),我这里是为了避免递归溢出。
还有其它方面的资料可以自行搜索setTimeout 0,或参考setTimeout延时0毫秒的作用
可以试一下这两个函数:
function recursion(){
console.log("An RangeError will come very soon.");
recursion();
console.log("You won't see me.")
}
// RangeError: Maximum call stack size exceeded
function nextTick(){
console.log("Happy running.");
setTimeout(nextTick, 0);
console.log("The 2nd Happy running.");
}
setTimeout(f, 0)的应用&利用Deferred实现队列运行的更多相关文章
- 【 js 基础 】【 源码学习 】 setTimeout(fn, 0) 的作用
在 zepto 源码中,$.fn 对象 有个 ready 函数,其中有这样一句 setTimeout(fn,0); $.fn = { ready: function(callback){ // don ...
- setTimeout(fn, 0) 的作用
在 zepto 源码中,$.fn 对象 有个 ready 函数,其中有这样一句 setTimeout(fn,0); 1 $.fn = { 2 ready: function(callback){ 3 ...
- JavaScript下的setTimeout(fn,0)意味着什么?
近期在研究异步编程的我对于setTimeout之类的东西异常敏感.在SegmentFault上看到了一个问题<关于SetTimeout时间设为0时>:提问者读了一篇文章,原文解释setTi ...
- 关于setTimeout(fn,0)
JS是单线程引擎:它把任务放到队列中,不会同步去执行,必须在完成一个任务后才开始另外一个任务. 浏览器的内核是多线程的,它们在内核制控下相互配合以保持同步,一个浏览器至少实现三个常驻线程:javasc ...
- setTimeout(fn,0)的作用分析
众所周知,大家对setTimeout的用法肯定都比较熟悉了,但是不是还是会经常忘记使用呢,例如博主阿里面试时就忘了,见阿里前端面试. 今天跟大家讨论一下setTimeout(fn,0)的用法,相信很多 ...
- Javascript定时器(三)——setTimeout(func, 0)
setTimeout(func, 0)可以使用在很多地方,拆分循环.模拟事件捕获.页面渲染等 一.setTimeout中的delay参数为0,并不是指马上执行 <script type=&quo ...
- setTimeout中0毫秒延时
先来看段代码,思考一下执行的结果. alert(1); setTimeout(function(){alert(2);}, 0); alert(3); 估计很多人认为执行结果为1,2,3,原因就是认为 ...
- setTimeout(fn, 0)引发的JavaScipt线程的思考
起因 周五改一个checkbox的display属性被错误地设置为none的bug. 经debug发现, 有两个地方修改了display属性: 1) checkbox的controller; 2) c ...
- js中 setTimeout延时0毫秒的作用
经常看到setTimeout延时0ms的javascript代码,感到很迷惑,难道延时0ms和不延时不是一个道理吗?后来通过查资料以及实验得出以下两个作用,可能还有作用我还不知道,希望得知的朋友在后面 ...
随机推荐
- 【转】MessageBox
MessageBox对话框是比较常用的一个信息对话框,其不仅能够定义显示的信息内容.信息提示图标,而且可以定义按钮组合及对话框的标题,是一个功能齐全的信息对话框. 1.函数原型及参数 function ...
- C++primer 阅读点滴记录(二)
智能指针(smart point) 除了增加功能外,其行为像普通指针一样. 一般通过使用计数(use count)或引用计数(reference count)实现智能指针,防止出现指针 ...
- GetProperties(BindingFlags)说明
Instance|Public:获取公共的的实例属性(非静态的) Instance|NonPublic:获取非公共的的实例属性(非静态的).(private/protect/internal) Sta ...
- 成为JAVA GC专家系列
http://www.360doc.com/content/13/0305/10/15643_269387617.shtmlhttp://www.360doc.com/content/13/0305/ ...
- STM32F0_新建软件工程详细过程
前言 由于ST公司推出比STM32F1性价比更高的F0芯片,现在市面上F0芯片的占有率也非常高.F0芯片属于M0内核,主频48M(当然,可以超频的,但尽量不要超的太多),资源大小可根据项目需求来选型. ...
- Microsoft SqlServer2008技术内幕:T-Sql语言基础-读书笔记1
一.理论背景:关系模型,其数学理论是集合论和谓词逻辑. 1.集合论:集合定义是把我们直观或思维中确定的,相互间有明确区别的那些对象视为一个整体,这个整体就是集合. 2.谓词逻辑:谓词是判断对象是否有某 ...
- kettle报错 ../deploy does not exist, please create it.
具体错误如下: Xlib: extension "RANDR" missing on display "localhost:10.0". ::, INFO [K ...
- Android--将字节数转化为B,KB,MB,GB的方法
//将字节数转化为MB private String byteToMB(long size){ long kb = 1024; long mb = kb*1024; long gb = mb*1024 ...
- hdu 2091 空心三角形
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=2091 空心三角形 Description 把一个字符三角形掏空,就能节省材料成本,减轻重量,但关键是为 ...
- python数组的使用
python数组的使用 2010-07-28 17:17 1.Python的数组分三种类型:(1) list 普通的链表,初始化后可以通过特定方法动态增加元素.定义方式:arr = [元素] (2) ...