node.js学习笔记(6) 异步回调

先来看一下国王的幸福生活:

在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"
}

国王:哎,我终于可以去睡觉了!

以上两种方案,第一种是异步回调的方式,国王安排完任务就可以轻松得去睡回笼觉了。第二种方式是同步的方式,国王必须等待仆人完成了任务才能去睡觉,如果这个任务特别难,那国王也只有等着干着急……


上一篇:程序员之路:C语言学生成绩处理小项目


下一篇:PHP如何实现大文件断点下载