菜鸟学习nodejs--回调函数

什么是回调函数

如果大家使用过jQuery,那么会掉函数就像家常便饭一样,例如我们经常会给一个事件传一个function的参数,其实这就是回调函数,回调函数就是我们所说的异步,如果还是有点蒙,那么我们来举个例子。 
我们新建一个index1.html和一个index2.html文件 
在index1.html

$(function(){
    $(‘p‘).hide(‘slow‘,functin(){
        alter("他隐藏了");
    });
});

在index2.html

function(){
    $(‘p‘).hide(‘slow‘);
    alert(‘他隐藏了‘);
}

两个函数,第一个出现的页面的字体是弹出弹框和隐藏p标签的文件几乎是同事,甚至是先有弹框,信息慢慢消失,而第二个函数,p中的信息慢慢的消失,然后出现弹框。

Node.js中的回调函数

新建一个callback.js文件 
添加如下代码:

function haveBreakfast(food, drink, callback) {
  console.log(‘早餐‘ + food + ‘, ‘ + drink);
  if (callback && typeof(callback) === "function") {
    callback();
  }
}

haveBreakfast(‘toast‘, ‘coffee‘, function() {
  console.log(‘早餐吃完了,工作了啦!‘);
});

输出结果如下: 

什么时候使用回调

什么时候使用呢,我们来看一个例子,然后再说明吧。 
新建一个file1.txt,写上文本aaaa,新建一个file2.txt,写上文本bbb,然后新建要给callback2.js文件 
 
在callback2中加入如下代码:

var fs = require(‘fs‘),
    http = require(‘http‘);

  http.get({ host: ‘baidu.com‘ }, function(res) {
      console.log(" 从baidu.com获取相应");
  }).on(‘error‘, function(e) {
      console.log("访问页面出现错误");
  });

  fs.readFile(‘file1.txt‘, ‘utf8‘, function (err, data) {
      if (err) throw err;
      console.log(‘File 被读取‘ + data);
  });

  http.get({ host: ‘www.sina.com.cn‘ }, function(res) {
      console.log("从sina.com.cn获取相应");

  }).on(‘error‘, function(e) {
      console.log("从sina.com.cn获取相应失败");

  });

  fs.readFile(‘file2.txt‘, ‘utf8‘, function (err, data) {
      if (err) throw err;
      console.log(‘File2被读取,内容是‘ + data);
  });

两次效果如下: 
 
从上边的结果我们可以看出来,其实谁先访问,谁后访问都是没有固定顺序的,对于网络的访问,我们需要根据网宽等很多情况,对于文件的读取,如果文件太大,他们他一定是后读出来的,而这个情况正式我们要解释的什么时候用,对于顺序性没有严格要求,而只是需要结果,那么OK,回调是你最好的选择。

同步和异步

Node.js希望我们再单一进程中使用异步编程,当然这个不是node.js或者JavaScript独有的,而是一种风格,例如c#中的Tread,Task,Java中的Thread,Runable等都是异步编程,重要的事情说三遍,这是一个种风格,这是一个种风格,这是一个种风格。如果我们使用同步,程序的运行可能就会照成阻塞,这样不利于我们CPU的利用。

小结

我们介绍了js中的回调函数,我们也介绍了Node.js中怎么用回调函数,还介绍了同步和异步的区别,当然我们是建议用异步的。这样资源的利用率会大大提高。

时间: 2024-10-22 11:11:18

菜鸟学习nodejs--回调函数的相关文章

学习js回调函数

<!DOCTYPE HTML> <html> <head> <meta charset="GBK" /> <title>回调函数(callback)</title> <script type="text/javascript" src="http://cdn.bootcss.com/jquery/1.9.0/jquery.min.js"></script&g

nodejs学习笔记 --回调函数

Node.js异步编程的直接体现就是回调 异步编程依托于回调来实现,但不能说使用了回调后程序就异步化了 回调函数在完成任务后就会被调用,Node使用了大量的回调函数,Node所有的API都支持回调函数 例如,我们可以一边读取文件,一边执行其他命令,在文件读取完成后,我们将文件内容作为回调函数的参数返回.这样在执行代码时就没有阻塞或等待文件 I/O 操作.这就大大提高了 Node.js 的性能,可以处理大量的并发请求. 阻塞代码实例 创建一个input.txt,内容如下:(注意保存编码格式为UTF

Java学习笔记——回调函数

转载:http://wangyang0311.iteye.com/blog/368031 一般来说分为以下几步: 声明回调函数的统一接口interface A,包含方法callback(); 在调用类caller内将该接口设置为私有成员private A XXX; 在caller内提供实现A接口的public方法(将外部该接口的实现类通过形参传入caller的XXX): caller的某个方法dosth()中会用到XXX.callback()方法; 在caller的实例中,先实现A接口,后调用d

nodejs回调函数

阻塞代码实例: main.js var fs=require("fs"); var data=fs.readFileSync("1.txt"); console.log(data.toString()); console.log("程序执行结束"); 非阻塞代码实例: main.js var fs=require("fs"); fs.readFile("1.txt",function(err,data){

菜鸟学习-C语言函数参数传递详解-结构体与数组

C语言中结构体作为函数参数,有两种方式:传值和传址. 1.传值时结构体参数会被拷贝一份,在函数体内修改结构体参数成员的值实际上是修改调用参数的一个临时拷贝的成员的值,这不会影响到调用参数.在这种情况下,涉及到结构体参数的拷贝,程序空间及时间效率都会受到影响. 例子: typedef struct tagSTUDENT{ char name[20]; int age; }STUDENT; void fun(STUDENT stu) { printf("stu.name=%s,stu.age=%d/

理解javascript中的回调函数(callback)

以下内容来源于:http://www.jb51.net/article/54641.htm 最近在看 express,满眼看去,到处是以函数作为参数的回调函数的使用.如果这个概念理解不了,nodejs.express 的代码就会看得一塌糊涂.比如: app.use(function(req, res, next) {    var err = new Error('Not Found');    err.status = 404;    next(err);}); app是对象,use是方法,方

回调函数callback使用例子

代码如下: <!DOCTYPE HTML> <html> <head> <meta charset="GBK" /> <title>回调函数(callback)</title> <script type="text/javascript" src="http://cdn.bootcss.com/jquery/1.9.0/jquery.min.js"></sc

js回调函数(callback)

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://luxiao1223.blog.51cto.com/2369118/482885 Mark! js学习 不喜欢js,但是喜欢jquery,不解释. 自学jquery的时候,看到一英文词(Callback),顿时背部隐隐冒冷汗.迅速google之,发现原来中文翻译成回调.也就是回调函数了.不懂啊,于是在google回调函数,发现网上的中文解释实在是太"深奥"了,我承认自己

js中的回调函数

回调就是一个函数的调用过程.那么就从理解这个调用过程开始吧.函数a有一个参数,这个参数是个函数b,当函数a执行完以后执行函数b.那么这个过程就叫回调. 其实中文也很好理解:回调,回调,就是回头调用的意思.函数a的事先干完,回头再调用函数b. 这里必须清楚一点:函数b是你以参数形式传给函数a的,那么函数b就叫回调函数. 也许有人有疑问了:一定要以参数形式传过去吗,我不可以直接在函数a里面调用函数b吗?确实可以.求解中. <解惑:如果你直接在函数a里调用的话,那么这个回调函数就被限制死了.但是使用函