2015年12月2日 星期三

ParseReact library

有鑒於實在是卡住太久了,決定回去看library,一打開.....襪靠.....到底是要我看到民國幾年.....對於功力淺薄的我看一個就要看好久,更別說是全部
所以我覺得先從最熟悉的Mutation.js開始看起

首先,先來找dispatch()

看來就是一個promise,沒做(noop,jquery的語法)就回傳空的,如果有的話,我們就去呼叫UpdateChannel.issueMutation(this, options || {})
(this是指什麼)
於是跳到了UpdateChannel.js


在這邊定義了target是從傳入的mutation中得到的,傳入的mutation就是createclass的this
先看option有沒有東西,如果沒有waitForServer的話就return performOptimisticMutation()
有的話就呼叫MutationExecutor.execute(從MutationExecutor.js來的,反正應該就是執行)

我們看見他做了兩件事:第一:把 Mutation 指給 current local state
第二:再通知server Mutation這個事件
如果這個request成功這個改變就會被local state承認
如果失敗就會倒退回去

先來看performOptimisticMutation()

在這裡先讀進剛剛產生的target(由mutation產生的),還有mutation,batch是options.batch(這什麼?)
當我們使用destroy,會呼叫ObjectStore的fetchSubscribers,如果不是呼叫destroy,就給一個空的latest,當我們使用create這個動作,會去呼叫ObjectStore的getLatest,在教得到的latest拿去比對queries,結果指給fields,再將這些結果傳給UpdateChannel 的pushUpdates


接下來繼續,宣告一個p的promise,如果MutationExecutor執行成功,就會直接把subscribers和changes傳給update
在裡面宣告三個變數
subscribers是去看ObjectStore.fetchSubscribers,如果有store[id]就回傳Object.keys(store[id].queries)如果有localSubscribers[id]就回傳 return Object.keys(localSubscribers[id]);都沒有就回傳空的,就是回傳符合這個object的queryhash
(store和localSubscribers的不同是什麼?)
delta是把傳進來的那個mutation(就是this)用Delta.js的generateDelta,餵給他MutationExecutor成功的結果(是什麼?Delta是什麼?用來幹嘛?)、changes是用ObjectStore.commitDelta,餵給他剛剛產生的delta,可以產生最新的object state還有changed的array key,如果上述都完成,就把上面產生的subscriberschanges傳給pushUpdates
目前subscribers表示的意思是有被儲存的object的queryhash
changes表示的事和delta比對之後,最新的object state和改變的array key

那如果失敗了,(表示MutationExecutor執行失敗),就會退回去把target刪了,首先先用ObjectStore.fetchSubscribers()去抓target,抓到了之後,如果我們是呼叫create這個動作,就會利用SubscriptionManager.js去把subscribers中的每個query hash去get subscription(subscription裡面包含什麼內容?)之後把它刪掉;如果不是create這個動作,會先宣告一個noop,(new Delta(target, {})是啥),然後呼叫ObjectStore.resolveMutation(),他可以回傳最新的object state還有改變的array key,然後再把這個傳給pushUpdates(subscribers, changes);

很好,終於開始看怎麼pushUpdates了
 pushUpdates()做的就是,當有一個object更改,會把這個object push到所有的subscribers,首先,會先看現在的subscribers,看剩下的誰還是match的,然後再用changed field去抓新的subscribers,再把新的match的object加上去。
首先,先看latest的部分是不是null(前面的performOptimisticMutation()可以找到),如果是就表示是Destroy,所以把current subscribers中的刪掉(刪掉誰?)

 這邊開始是去找object是不是還match這個query,然後利用changed keys去找現在match的query。
首先我們先把subscribers一個一個讀進來,如果matchesQuery,且目前的changes.id和changes.latest.id不同,就要使用Create method,就是第二個if的地方,把舊的changes.id移掉之後,把新的changes.latest加上去
如果是一樣的,就直接push到subscription就好
如果根本就不matchesQuery,直接移掉

接下來是potential的部分,(誰是potential....),SubscriptionManager的queriesForFields()回傳的是Object.keys(queries),看起來就是特定限制中的query list,應該是新的部分,如果match query就加上去,如果是user的話是看LocalSubscriptions(我先不管他)

現在轉過來細細看中間的ObjectStore.js,是一個parse object的cache,他可以存取最新版本的server data,並將他們用pending mutation 堆疊起來。

store{}是拿來放每個object最新的state,也就是suscribed queries的hash,localSubscribers = {}是拿來放只有存在local的object的queries hash
pendingMutations = {}是存每個object的pending mutations


storeObject()是利用data.id來把object放到store裡面
首先把data傳進來,queries是空的,如果有store[data.id]就產生queries給store[data.id].queries,如果沒有話就直接指定空的queries給data,並回傳他的id
(有誰呼叫storeObject()?)

removeObject()是用id來把object從suscribed裡面移除(
把剛剛產生的store[id].queries依照key放到subscribed(這是一個list),刪掉 store[id]之後再把subscribed這個是放query hashes的list

Object.keys(store[id].queries)是什麼?剛剛有產生的應該是最上面宣告Object.defineProperty(exports, '__esModule', {
  value: true
});
誰是__esModule?有什麼class可以使用?)



addSubscriber()是將object Id和query hash連起來
如果有store[id]而且query是有hash過的,就給他true,表示這個object matches query,或是有localSubscribers[id]而且query也有hash過,也給他true,表示這個object matches query,如果都沒有,就只給localSubscribers[id]

removeSubscriber()跟上面相反,把object Id和query hash連不起來的刪了,
如果有store[id],就把queries的hash刪掉,如果是有localSubscribers[id],就把localSubscribers[id][hash]刪了,而且如果Object.keys(localSubscribers[id]).length < 1就把它完全從list裡面刪掉。


fetchSubscribers()回傳所有match的query hash,如果有store[id]就回傳store[id]的query hashes的list,如果有localSubscribers[id]就回傳localSubscribers的query hashes的list,都沒有就回傳null

看library根本就不是人做的事情啊==,我認真快中風,而且我在有限的時間內沒辦法認真細細看完,可是研讀上述程式碼之後我大略有懂他程式的邏輯

這裏用一張圖來表示



沒有留言:

張貼留言