任务:从mongodb中导出csv数据,输出内容如下
userid username usergender points

points表:

{ "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实现队列运行的更多相关文章

  1. 【 js 基础 】【 源码学习 】 setTimeout(fn, 0) 的作用

    在 zepto 源码中,$.fn 对象 有个 ready 函数,其中有这样一句 setTimeout(fn,0); $.fn = { ready: function(callback){ // don ...

  2. setTimeout(fn, 0) 的作用

    在 zepto 源码中,$.fn 对象 有个 ready 函数,其中有这样一句 setTimeout(fn,0); 1 $.fn = { 2 ready: function(callback){ 3 ...

  3. JavaScript下的setTimeout(fn,0)意味着什么?

    近期在研究异步编程的我对于setTimeout之类的东西异常敏感.在SegmentFault上看到了一个问题<关于SetTimeout时间设为0时>:提问者读了一篇文章,原文解释setTi ...

  4. 关于setTimeout(fn,0)

    JS是单线程引擎:它把任务放到队列中,不会同步去执行,必须在完成一个任务后才开始另外一个任务. 浏览器的内核是多线程的,它们在内核制控下相互配合以保持同步,一个浏览器至少实现三个常驻线程:javasc ...

  5. setTimeout(fn,0)的作用分析

    众所周知,大家对setTimeout的用法肯定都比较熟悉了,但是不是还是会经常忘记使用呢,例如博主阿里面试时就忘了,见阿里前端面试. 今天跟大家讨论一下setTimeout(fn,0)的用法,相信很多 ...

  6. Javascript定时器(三)——setTimeout(func, 0)

    setTimeout(func, 0)可以使用在很多地方,拆分循环.模拟事件捕获.页面渲染等 一.setTimeout中的delay参数为0,并不是指马上执行 <script type=&quo ...

  7. setTimeout中0毫秒延时

    先来看段代码,思考一下执行的结果. alert(1); setTimeout(function(){alert(2);}, 0); alert(3); 估计很多人认为执行结果为1,2,3,原因就是认为 ...

  8. setTimeout(fn, 0)引发的JavaScipt线程的思考

    起因 周五改一个checkbox的display属性被错误地设置为none的bug. 经debug发现, 有两个地方修改了display属性: 1) checkbox的controller; 2) c ...

  9. js中 setTimeout延时0毫秒的作用

    经常看到setTimeout延时0ms的javascript代码,感到很迷惑,难道延时0ms和不延时不是一个道理吗?后来通过查资料以及实验得出以下两个作用,可能还有作用我还不知道,希望得知的朋友在后面 ...

随机推荐

  1. How to using to code import to GL journal[AX2012]

    static void THK_importLedgerJournalTrans(Args _args) { Filename fileName = "C:\\Users\\ksiu3880 ...

  2. SQL Server 基础:Case两种用法

    测试数据 1).等值判断->相当于switch case select S#,C#,C#=( case C# when 1 then '语文' when 2 then '数学' when 3 t ...

  3. Ubuntu 12.04 添加新用户并启用root登录

    启动root sudo passwd 输入密码 输入root 新密码并重复 su 切换root 添加用户比如hduser 修改密码hduserchmod u+w /etc/sudoersvi sudo ...

  4. mongodb 3.2存储目录结构说明

    [root@hadoop1 mongodb]# tree ./data ./data |-- WiredTiger | |-- WiredTiger.lock | |-- WiredTiger.tur ...

  5. sqlalchemy - day4

    query 此文算是自己的一个总结,不敢说对sqlalchemy有多精通,只能算是入门的总结,免得后面忘记了这些个基本的东西.数据库的增,删,改,查,前面已经介绍了session的增,删,改,现在来介 ...

  6. 开始认真学计算机网络----computer network学习笔记(一)

    什么是计算机网络,就是连一堆计算机,计算机不单单指pc,还包括打印机啦,手机啦巴拉巴拉一堆 为什么要连,share data共享数据 数据? 文档,图片,视频,巴拉巴拉 网络有什么类型? LAN--- ...

  7. SQL语句基础之 管理数据库,表 和 数据

    MySQL中的基本sql语句 MySQL中主要有三个大的对象,第一个是数据库,有了数据库后,我们才能在数据库里面建表,因为Mysql是关系数据库,它的数据都会以记录的形式存到表里,所以第二个是表,然后 ...

  8. properties文件

    properties文件也叫资源文件,以键值对的形式存放文本内容.一个properties对象代表一个资源文件 步骤:1.生成properties对象2.生成InputStream/Reader来读取 ...

  9. C,C++回文字符串判断(字符串指针的用法)

    功能:输入一个字符串,判断是否为回文. 主要锻炼指针的用法. 1.C版 #include<stdio.h> int main() { ]; char a; ,flag=; while((a ...

  10. Spring IOC 方式结合TESTGN测试用例,测试简单java的命令模式

    java命令模式: 可以命令("请求")封装成一个对象,一个命令对象通过在特定的接收着上绑定一组动作来封装一个请求.命令对象直接把执行动作和接收者包进对象中,只对外暴露出执行方法的 ...