觀察者模式小探
阿新 • • 發佈:2018-08-02
組件 觀察者 getter ner sub design ren script ext 選項,Vue 將遍歷此對象所有的屬性,並使用 Object.defineProperty 把這些屬性全部轉為 getter/setter。
在嘗試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
第二段話:每個組件實例都有相應的 watcher 實例對象,它會在組件渲染的過程中把屬性記錄為依賴,之後當依賴項的 setter
被調用時,會通知 watcher
重新計算,從而致使它關聯的組件得以更新。
跟七牛雲的實例分析相比,
- Vue遍歷data後,每個data就已經是可觀察的對象(或是說屬性了),更具體的話該是每個屬性的setter???有了可訂閱的能力;
- watcher是綁定到組件實例的,每當setter被調用,會通知到watcher,那麽setter和watcher之間就會有一個“橋梁”,使setter能通知到watcher。
這不就是觀察者模式了????
身在山中不見山啊!!!
觀察者模式小探