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和不延时不是一个道理吗?后来通过查资料以及实验得出以下两个作用,可能还有作用我还不知道,希望得知的朋友在后面 ...
随机推荐
- 清除VS2012生成的不必要文件
VS2012生成的项目文件中会有一个与解决方案同名的sdf文件,并且比较大,可以删除的,具体方法如下: 英文版步骤如下: Tools->Options->Text Editor->C ...
- 清理sql2000查询分析器登录名记录
注册表 HKEY_CURRENT_USER/Software/Microsoft/Microsoft SQL Server/80/Tools/Client/PrefServers
- C# 笛卡尔积
void Main() { string[] str1 = { "a", "b" }; " }; string[] str3 = { "一& ...
- Mongodb的索引--学习笔记(未完)
全文索引 建立方法: --在articles集合的key字段上创建全文索引 db.articles.ensureIndex({key:"text"}) --在articles集合的 ...
- 关于EasyUI与富文本编辑器结合使用的问题(kindueditor与uueditor)
最近使用easyui玩玩项目,在结合富文本编辑器时遇到了一些问题,很多人(在网上看到)集成富文本编辑器时常常不能显示, 第一次打开编辑的时候没有问题,但是第二次打开就出错了.为此我进行了一些调试研究. ...
- 部署ghost博客
wget https://ghost.org/zip/ghost-0.6.4.zip npm install --production NODE_ENV=production npm start &g ...
- 初识java之Mina(一)
Apache Mina Server 是一个网络通信应用框架,也就是说,它主要是对基于 TCP/IP.UDP/IP协议栈的通信框架(当然,也可以提供 JAVA 对象的序列化服务.虚拟机管道通信服务等) ...
- Swift Tips - Array 类型
在开发中,数组这个概念我们应该很熟悉了,Objective-C 中为我们提供了 NSArray 作为数组的实现.大家应该对很熟悉了.而在 Swift 中,为我们提供了它自己对于数组的实现,也是这里我们 ...
- 分享一下 aix安装python提示C编译器问题的办法
今天在AIX上面安装Python-2.7.2时失败,报下面的错误 checking for --enable-universalsdk... no checking for --with-univer ...
- iOS10推送必看UNNotificationServiceExtension
转:http://www.cocoachina.com/ios/20161017/17769.html (收录供个人学习用) iOS10推送UNNotificationServic 招聘信息: 产品经 ...