最近在学nodejs ,对于异步的概念早就理解了,但是,却有一个问题一直不解。
问题描述:
javascript是一个单线程的语言,那他是如何实现异步的呢?
看了很多资料,终于找到了答案:
所有的关键是:setTimeout、setInterval。
对于异步不了解的朋友自行google,我这里简单阐述一下javascript异步实现的两种机制
- callback
- 事件
其实,时间也通过callback实现的,那callback又是如何实现异步的呢?callback本身没什么神奇的地方,只不过是将一个函数体作为变量传入到另外一个函数中,callback可以有同步也可以异步,同步很简单,举个例子:
var func1=function(callback){
//do something.
(callback && typeof(callback) === "function") && callback();
}
func1(func2);
var func2=function(){
}
那异步的实现,则要靠
setTimeout 了,
function f1(callback){
setTimeout(function () {
// f1的任务代码
callback();
}, 1000);
}
举个具体的例子:
function f1(callback){
setTimeout(function () {
// f1的任务代码
callback();
}, 1000);
}
f1(function(){
console.log('我居然第二个输出!');
})
console.log('我第一个输出!哈哈哈哈');
上面code中,f1 函数先被执行,然而却后输出,这就是因为用了
setTimeout
。记住下面这句话:
setTimeout、setInterval 这两个函数都是异步的,即:
他们的调用时序和程序的主流程是相对独立的,所以没有办法在主体里面等待它们的返回值,它们被打开的时候程序也不会停下来等待,否则也就失去了setTimeout及setInterval的意义了
(setTimeout的延迟时间为0,这个hack经常被用到,settimeout调用的函数其实就是一个callback的体现)
说了这么多,我主要想说的就是:javascript之所以能实现异步,主要靠的是setTimeout ,而不仅仅是callback!!!
希望能给你们带来帮助。欢迎探讨。
参考资料:
http://www.cnblogs.com/yunkou/p/4088755.html
http://www.ruanyifeng.com/blog/2012/12/asynchronous%EF%BC%BFjavascript.html