1. 程式人生 > >進擊Node.js基礎(二)

進擊Node.js基礎(二)

內部 socket ada cte 通過 func onf hello 語言

一.一個牛逼閃閃的知識點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基礎(二)》。

進擊Node.js基礎(二)