先来看一下国王的幸福生活:
在nodejs王国,国王有很多仆人。
早上,一个仆人叫醒了国王,问他有什么需要。
国王给他一份清单,上面列举了所有需要完成的任务,然后睡回笼觉去了。
当国王回去睡觉之后,仆人才离开国王,拿着清单,给其它的仆人一个个布置任务。
仆人们各自忙各自的去了,直到完成了自己的任务后,才回来把结果禀告给国王。
国王一次只召见一个人,其它的人就在外面排着队等着。
国王处理完这个结果后,可能给他布置一个新的任务,或者就直接让他走了,然后再召见下一个人。
等所有的结果都处理完了,国王就继续睡觉去了。直接有新的仆人完成任务后过来找他。
--这个故事来自http://www.360doc.com/content/12/0926/15/9579107_238274731.shtml,非常感谢。
在这个故事中,国王就是我们的javascript代码,仆人就是nodejs本身。
国王只有一个,仆人有多个。
javascript是单线程的,nodejs本身却是多线程的。
国王交待了任务给仆人后,自己去睡觉了,并没有一直等待仆人完成。因此,仆人的工作与国王的交待是异步的。
当仆人完成任务后再去告知国王。这就是回调。
callback.js:
var fs = require("fs");
fs.readFile('package.json', function (err, data) {
if (err)
return console.error(err);
console.log('仆人:国王,我的任务完成了。这是结果\n'+data.toString());
});
console.log("国王:任务交待完了,我去睡觉啦!");
运行结果:
lee@mypc ~/works/nodejs/study6 $ node callback.js
国王:任务交待完了,我去睡觉啦!
仆人:国王,我的任务完成了。这是结果
{
"name": "application-name",
"version": "0.0.1"
}
当然,国王也可以一直等到仆人完成了任务在去睡觉。
nocb.js:
var fs = require("fs");
var data = fs.readFileSync('package.json');
console.log('仆人:国王,我完成任务了。这是结果\n'+data.toString());
console.log("国王:哎,我终于可以去睡觉了!");
运行结果如下:
lee@mypc ~/works/nodejs/study6 $ node nocb.js
仆人:国王,我完成任务了。这是结果
{
"name": "application-name",
"version": "0.0.1"
}
国王:哎,我终于可以去睡觉了!
以上两种方案,第一种是异步回调的方式,国王安排完任务就可以轻松得去睡回笼觉了。第二种方式是同步的方式,国王必须等待仆人完成了任务才能去睡觉,如果这个任务特别难,那国王也只有等着干着急……