进击Node.js基础(二)

一.一个牛逼闪闪的知识点Promise
  npm install bluebird

二.牛逼闪闪的Promise只需三点
1.Promise是JS针对异步操作场景的解决方案
  针对异步的场景,业界有很多解决方案,如回调、事件机制
  Promise是一个对象,同时它也一种规范,针对异步操作约定了统一的接口,表示一个异步操作的最终结果以同步的方式来写代码,执行的操作是异步的,但是又保证程序的执行顺序是同步的。
  原本是社区的一个规范的构想,被加入到ES6的语言标准里面,比如Chrom,Firefox浏览器已对它进行了实现。
2.Promise对象三种状态
  未完成(pending)
  已完成(fulfilled)
  失败(rejected)
  只能从未完成到已完成,或者从未完成到失败,不可逆的。
3.ES6的Promise语言标准、Promise/A+规范
  Promise/A+规范算是之前的Promise/A规范的升级版,规定了行为标准,扩展了原来的规范,并且覆盖了一些约定俗成的行为,总之,它就是一个更为标准的Promise能力和使用的规范。
  Promise/A与A+不同点
  a.A+规范通过术语thenable来区分promise对象
  b.A+定义onFulfilled/onRejected必须是作为函数来调用,而且调用过程必须是异步的
  c.A+严格定义了then方式链式调用时onFulfilled/onRejected的调用顺序
4.如何使用Promise then方法

promiseObj.then(onFulfilled, onRejected)
onFulfilled = function(value) {
  return promiseObj2
}
onRejected = function(err) {}

  Promise会保证then方法回调的顺序,依次调用,会等前面的promise方法执行完成后才会执行后面then中的方法。

  Promise最大的特点是:回调函数可以写成规范的链式的写法,程序流程可以很清楚。它的一整套接口可以实现很强大的功能,比如为多个异步操作部署一个回调函数,为多个回调函数中抛出的错误统一指定处理的方法等等。
5.在什么场景下使用
  只要是异步编程的地方,都可以使用Promise,但不能Promise而Promise,如业务场景是很简单的异步操作,维护很容易了,没必要引入一个Promise库来重构。
6.Promise库
  Promise库市面上有不少,如下所示:
  bluebird
  Q
  then.js
  es6-promise
  ypromise
  async
  nativeo-promise-only

三.重点爬虫,更优雅的异步编
  https协议是基于ssl/tls的http协议,所有数据都是在ssl/tls协议的封装之上传输的。
  也就是说,https协议是在http协议的基础之上添加了ssl/tls握手及数据加密传输,因此,ssl/tls协议就是http和https最大区别。
  在搭建https服务器的时候,需要有一个ssl证书。

四.Nodejs API
1.横扫Nodejs API-Buffer的实例
  Buffer:用来处理二进制的数据。因为JS字符串是UTF-8的编码存储的,处理二进制的能力是很弱的,而网络层对于不同资源的请求、响应,甚至是文件都是二进制的方式来交互的,所以Node.js有这么一个接口,专门用于存放二进制数据的缓存区,并提供了一些方法来对缓存区数据进行进一步的处理。Buffer在Node.js中是要以全局访问的,不需要用require来加载。

> Buffer
{ [Function: Buffer]
poolSize: 8192,
from: [Function: from],
of: [Function: of],
alloc: [Function: alloc],
allocUnsafe: [Function: allocUnsafe],
allocUnsafeSlow: [Function: allocUnsafeSlow],
isBuffer: [Function: isBuffer],
compare: [Function: compare],
isEncoding: [Function: isEncoding],
concat: [Function: concat],
byteLength: [Function: byteLength],
[Symbol(kIsEncodingSymbol)]: [Function: isEncoding] }
> new Buffer(‘Hello Node.js‘)
<Buffer 48 65 6c 6c 6f 20 4e 6f 64 65 2e 6a 73>
> new Buffer(‘Hello Node.js‘, ‘base64‘);
<Buffer 1d e9 65 a0 da 1d 7a 3b>
> var buf = new Buffer(8);
undefined
> buf.length
8
> var buf = new Buffer(‘12345678‘);console.log(buf);
<Buffer 31 32 33 34 35 36 37 38>
undefined
> var buf = new Buffer(7);buf.write(‘12345678‘);console.log(buf);
<Buffer 31 32 33 34 35 36 37>
undefined
> var buf = new Buffer([1,2,3,4]);console.log(buf);
<Buffer 01 02 03 04>
undefined
> console.log(buf[1])
2
undefined
> var buf = new Buffer([1,2.33,3.11,4]);console.log(buf);
<Buffer 01 02 03 04>
undefined
> console.log(buf[1])
2
undefined

a.buffer.write(string, offset=0, length, encoding=‘utf8‘)方法

> var buf = new Buffer(‘Hello 慕课网‘)
undefined
> buf.length
15
> buf.write(‘Hi 慕课网‘)
12
> buf.toString()
‘Hi 慕课网网‘
> buf.length
15
> buf.write(‘ ImoocImoocImooc‘, 2, 16)
13
> buf.toString()
‘Hi ImoocImoocIm‘

b.buffer.copy(target, tStart, sStart, sEnd=buffer.length)

> var buf = new Buffer(‘Hello Imooc‘)
undefined
> buf.length
11
> var buf2 = new Buffer(5)
undefined
> buf.copy(buf2)
5
> buf2.toString()
‘Hello‘
> buf.copy(buf2, 0, 6, 11)
5
> buf2.toString()
‘Imooc‘

c.buffer.js源码

var buffer = process.binding(‘buffer‘);
process.binding它是一个桥梁,javaScript代码就可以和C++代码进行交互,这条语句获取到C++里面实现的buffer模块

> var buf = new Buffer(‘imooc‘);
undefined
> var str = buf.toString(‘base64‘);
undefined
> str
‘aW1vb2M=‘
> var buf = new Buffer(‘aW1vb2M=‘, ‘base64‘)
undefined
> var str = buf.toString()
undefined
> str
‘imooc‘
> var buf = new Buffer(‘aW1vb2M=‘, ‘base64‘)
undefined
> var str = buf.toString(‘hex‘)
undefined
> str
‘696d6f6f63‘
> var buf = new Buffer(‘696d6f6f63‘, ‘hex‘)
undefined
> var str = buf.toString(‘utf8‘)
undefined
> str
‘imooc‘
>

2.Stream流

  Readable:可读流,负责读取外部的数据,并把数据缓存到内部的Buffer数组
  Writable:可写流,负责消费数据,从可读流里获取到数据,然后对得到的数据块进行处理
  Duplex:双工流,实现了Readable、Writable两个接口,如TcpSocket
  Transform:转换流,也是双工的,可读可写,实现了Readable、Writable两个接口,但不保留数据

学习视频《进击Node.js基础(二)》。

原文地址:https://www.cnblogs.com/flyingeagle/p/9032826.html

时间: 2024-10-11 23:28:09

进击Node.js基础(二)的相关文章

进击Node.js基础(一)

一.前言 1:Node.js本质上是用chrome浏览器 v8引擎 使用c++编写的JS运行环境 2:相比于JS没有浏览器安全级的限制,额外提供了一些系统级的API:文件读写,进程管理,网络通信等. 3:有很多借助NODE.JS完成的项目如appjs跨平台桌面应用,Jade和node.js组合使用便捷管理后台html模板,grunt自动化运行工具,express.js 4:nodejs.org,npmjs.com模块社区,github,stackoverflow 5:gitbash:类似cmd,

进击Node.js基础(二)promise

一.Promise JS动画settimeout,setinterval,requestAnimationFrame,promise npm install bluebird Javascript的特点是异步,Javascript不能等待,如果你实现某件需要等待的事情,你不能停在那里一直等待结果回来,相反,底线是使用回调callback:你定义一个函数,这个函数只有等到结果可用时才能被调用. 这种回调模型对于好的代码组织是没有问题的,但是也可以通过从原始回调切换到promise解决很多问题,将p

04慕课网《进击Node.js基础(一)》HTTP讲解

HTTP:通信协议 流程概述: http客户端发起请求,创建端口默认8080 http服务器在端口监听客户端请求 http服务器向客户端返回状态和内容 稍微详细解析: 1.域名解析:浏览器搜素自身的DNS缓冲,查看是否有被请求的域名所定义的IP,缓冲1分钟 ## 谷歌浏览器输入:chrome://net-internals/#dns 2.搜索操作系统自身的DNS缓冲(浏览器无缓冲或失效) 3.读取本地的HOST文件 C:\Windows\System32\drivers\etc 4.浏览器发起

05慕课网《进击Node.js基础(一)》HTTP概念进阶

HTTP模块介绍 支持http协议的更多特性 不缓存请求和响应 API比较底层处理流相关,信息解析 HTTP相关概念 回调 将函数作为参数传到执行函数中,参数函数在执行函数中嵌套执行 function learn(something){ console.log(something); } function we(callback,something){ something+=' is cool' callback(something) } //具名函数 we(learn,'Nodejs') //

08慕课网《进击Node.js基础(一)》事件events

引用events模块中的EventEmitter 事件的监听和发射 相同的事件发射数量有限,可以通过setMaxListeners设置峰值 var EventEmitter = require('events').EventEmitter var life = new EventEmitter() //加不加都没有报警告 //life.setMaxListeners(10) life.on('clickEvent',function(who){ console.log('给' + who + '

10慕课网《进击Node.js基础(一)》初识promise

首先用嘴简单的方式实现一个动画效果 <!doctype> <html> <head> <title>Promise animation</title> <style type="text/css"> .ball { width: 40px; height: 40px; border-radius: 20px; } .ball1 { background: red; } .ball2 { background: ye

11慕课网《进击Node.js基础(一)》Buffer和Stream

Buffer (logo.png) 以下代码读取logo.png为buffer类型 然后将buffer转化为string 可以将字符串配置: data:image/png;Base64,Buffer.toString() var fs = require('fs') fs.readFile('logo.png',function(err,origin_buffer){ console.log('origin_buffer是否Buffer格式:'+Buffer.isBuffer(origin_bu

node.js基础模块http、网页分析工具cherrio实现爬虫

node.js基础模块http.网页分析工具cherrio实现爬虫 一.前言      说是爬虫初探,其实并没有用到爬虫相关第三方类库,主要用了node.js基础模块http.网页分析工具cherrio. 使用http直接获取url路径对应网页资源,然后使用cherrio分析. 这里我主要学习过的案例自己敲了一遍,加深理解.在coding的过程中,我第一次把jq获取后的对象直接用forEach遍历,直接报错,是因为jq没有对应的这个方法,只有js数组可以调用. 二.知识点    ①:supera

NodeJs&gt;-------&gt;&gt;第三章:Node.js基础知识

第三章:Node.js基础知识 一:Node.js中的控制台 1:console.log.console.info  方法 1 console.log("this is a test string."); 1 node app1.js 1> info.log 1 console.log("This is a test String ."); 2 3 //从第二个参数开始,依序输出所有的字符串 4 console.log("%s","