I/O和回调(回顾!)

事件驱动编程——处理不可预测性
Node的事件化的I/O模型——无须担心互锁和并发这两个在多线程异步I/O中常见的问题。
var http = require ('http'),
     urls = ['shapeshed.com','www.bbc.co.uk','edition.cnn.com'];

function fetchPage(url) {
    var start = new Date();
    http.get({host: url}, function (res) {
        console.log("Got respose from: " + url);
        console.log('Request took:', new Date() - start, 'ms');
    });
}

for(var i = 0; i < urls.length; i++){
    fetchPage(urls[i]);
}


我们发现同一个程序会有多样的无法预测的结果,所以联网的I/O口是不可预测的。
并发!——指的是许多人同时尝试做同样的事情。
这个我还没成功,有点问题~
 
回调
函数可以作为一个参数传递到另一个函数中,然后被调用。haveBreakfast函数将所吃的东西记录到控制台中然后调用作参数传递给它的回调函数。
function haveBreakfast(food, drink, callback) {
  console.log('Having breakfast of ' + food + ', ' + drink);
  if (callback && typeof(callback) === "function") {
    callback();
  }
}

haveBreakfast('toast', 'coffee', function() {
  console.log('Finished breakfast. Time to go to work!');
});

Node.js如何使用回调
回调函数的调用发生在远程服务器发挥响应之后而不是之前。Node.js以提供一个创建物联网应用程序的平台为目标。
回调是Node.js实现网络编程的关键方法。因为回调让代码在其他事件发生的时候能够运行。当事件发生时,我们称回调被“触发(fired)”从而导致回调函数被调用。
例子1很简单
var fs = require('fs');

fs.readFile('ok.txt', 'utf8', function (err, data) {
    if (err) throw err;
    console.log(data);
})

例子二则是http模块
var http = require ('http');

http.get({host: 'www.baidu.com'}, function(res) {
    console.log("Got response: " + res.statusCode);
}).on('error', function(e) {
    console.log("Got error: " + e.message);
});

第三个例子比较综合~
var fs = require('fs'),
    http = require('http');

http.get({ host: 'shapeshed.com' }, function(res) {
    console.log("Got a response from shapeshed.com");
}).on('error', function(e) {
    console.log("There was an error from shapeshed.com");
});

fs.readFile('file1.txt', 'utf8', function (err, data) {
    if (err) { throw err; }
    console.log('File 1 read!');
});

http.get({ host: 'www.bbc.co.uk' }, function(res) {
    console.log("Got a response from bbc.co.uk");
}).on('error', function(e) {
    console.log("There was an error from bbc.co.uk");
});

fs.readFile('file2.txt', 'utf8', function (err, data) {
    if (err) { throw err; }
    console.log('File 2 read!');
});

Node.js在还有已经注册的回调尚未触发之前将不会退出,回调首先是负责解决不可预测性的方法,他也是处理并发(一次做超过一件事情)的高效方法。
思考:这些事件是如何异步发生的?回调是如何用于在操作完成后做其他事情的?
其实这一课学得懵懵懂懂~还得不断去理解阿!加油!

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值