异步与回调
异步&回调函数
A异步
Node.js与汇总不同的地方第一点就是异步IO和事件驱动。
机制是什么:
illustration:
function test(){
for(var i=0;i<10;i++){
console.log(new Date);
setTimeout(function(){},2000);
}
};
statement:
setTimeout(callback(),time);在经过time的时间之后,执行callback函数。
可以分析得到,时间信息都是在12;54;27时刻打印出来的。
由此可以推理,console.log()函数和setTimeout()函数是异步执行的。
根据Node.js异步机制,setTimeout在运行到setTimeout()的时候,注册了一个两秒后执行的回调函数,接着返回了循环。
illustration:
for(var i=0;i<10;i++){
setTimeout(function(){console.log(new Date),2000);
}
statement:
可以分析得到,时间信息都是在13;08;24时刻打印出来的。
程序中在极短的时间内注册了10个2秒后执行的console.log(new Date);。
BNode.js异步编程的直接体现就是回调。
1回调函数:
作为另一个函数的参数传入的函数。
回调函数如何传参数:
方式1-将回调函数的参数作为与函数同级的参数传递。
代码:
function A(parameter1){alert(paramter1)};
function B(funcition1,parameter1){function1(parameter1)};
B(A,"parameter");
方式2-将回调函数的参数在调用回调的函数内部创建。
代码:
function A(parameter1){alert(paramter1)};
function B(function1){var parameter="parameter";A(parameter);};
B(A);
2异步与回调的关系:
通过回调函数的使用体现异步编程。
但是使用回调不意味程序异步。
解释:回调函数在完成任务之后就会被调用。Node使用了大量的回调函数。
illustration :
var fs=require('fs');
var data=fs.readFileSync('A.txt');
console.log(data.toString());
console.log('End.');
以上是阻塞案例,程序会先输出A文件的内容,再输出‘End’,因为在data定义时执行了同步读文件的函数readFileSync()。
var fs=require('fs');
fs.readFile('A.txt',function(err,data){
if(err) return console.error(err);
console.log(data.toString());
});
console.log('End.');
以上是非阻塞案例,程序会先输出‘End’,再输出A文件的内容。
statement:
fs模块用于对系统文件和目录进行读和写。
fs.readFile(filename,[encoding],[callback(err,data)]):以异步的方式读取文件内容。