1. 程式人生 > >觀察者模式小探

觀察者模式小探

組件 觀察者 getter ner sub design ren script ext

在嘗試ng5+示例時初識可觀察對象,之後在項目中使用七牛雲上傳視頻的時候再次遇到,雖然項目已經上線並正常使用,可-------幾乎不理解。

定義

記錄一下‘思想’

let observable = qiniu.upload(file, key, this.token, putExtra, config);//file文件 key文件名 token最好從後臺獲取
let observer = {
  next(res) {//接收上傳進度信息
    _this.percentage = res.total.percent;
  },
  error(err) {//上傳失敗觸發
    //do something
  },   complete(res) {//上傳完成觸發     //。。。。。。。。。   } }; observable.subscribe(observer); // 上傳開始

七牛雲上傳視頻的一段代碼。

qiniu.upload返回一個‘可觀察對象(observable)’-----能夠訂閱observer的對象。每當observable改變。就會觸發observer。也可以這麽說,observable是一個可觀察對象,通過subscribe使observer成為它的觀察者,每當observable改變,就會通知到observer。

寫到這裏,突然想到vuejs數據響應原理。。。

第一段話:當你把一個普通的 JavaScript 對象傳給 Vue 實例的 data

選項,Vue 將遍歷此對象所有的屬性,並使用 Object.defineProperty 把這些屬性全部轉為 getter/setter。

第二段話:每個組件實例都有相應的 watcher 實例對象,它會在組件渲染的過程中把屬性記錄為依賴,之後當依賴項的 setter 被調用時,會通知 watcher 重新計算,從而致使它關聯的組件得以更新。

跟七牛雲的實例分析相比,

  • Vue遍歷data後,每個data就已經是可觀察的對象(或是說屬性了),更具體的話該是每個屬性的setter???有了可訂閱的能力;
  • watcher是綁定到組件實例的,每當setter被調用,會通知到watcher,那麽setter和watcher之間就會有一個“橋梁”,使setter能通知到watcher。

這不就是觀察者模式了????

身在山中不見山啊!!!

觀察者模式小探