在0.3版加入了DataManager,基於策略的數據管理模塊;是SmartJS中比較重要的一個系列。整個個DataManager模塊包括有:dataManager,dataPolicyManager,dataServices三個管理對象;git
數據管理的核心引擎;定義了一系列的接口和方法,不能直接使用,必須建立出具體類型的數據管理才能使用。引擎主要提供了存、取兩個動做和內外兩個通道;內置了基礎的策略;過濾條件解析器;github
能夠定義針對不一樣類型的數據管理,如:object,table,tree;經過定製策略能夠簡單的實現各類數據交互;好比:數據懶加載,定時更新,數據同步等等;web
數據服務管理;定義了數據服務的接口和通用操做方法;不能直接使用,必須建立具體類型的數據服務;ajax
數據服務的定義就比較廣了,能夠是具體的對象方式locaStorage,IndexDB,或者是一些行爲ajax,comet,websocket;也能夠是根據業務規則定義的rest,cache等;websocket
數據策略管理;爲dataManager服務,提供註冊策略點以及應用到dataManager的方法;這個須要對dm實現和流程比較瞭解才能註冊策略點,不用太多關注。異步
感受這樣介紹也很難理解,下面咱們先來看一張DataManager的數據交互圖:socket
分析一下該圖,首先Active去向dm請求數據,dm判斷是否須要向ds請求(判斷基於設定的策略)。若是不請求,則直接返回dm內部響應的結果。spa
若是須要向DataServices請求,則發送請求,而後ds將響應的數據響應給dm,在由dm返回結果。rest
在來看一下DataManager具體的執行圖:對象
呵呵,初看應該是有點暈的,畫的不夠清晰。
圖中以獲取數據的動做,詳細描述了執行主流程(還有一些策略影響的流程沒體現),用數字標示了執行流程順序:
1. 獲取動做進入第一個策略點check get way,判斷從什麼地方獲取數據,默認的auto,先從dm取,取不到在從ds取;ds則是隻從ds取;dm則是隻在dm內部取;
2. 經過第一個策略點後會從dm根據過濾條件取到數據
3. 當第一個策略點的結果爲ds時,則直接進入3,同時不會進入2,4,5,6四個流程;直接進入7 get數據服務管理
4. 在2中取到數據之後,進入判斷數據是否爲空的策略點;不爲空則進入流程5;爲空的話,進入流程6
5. 返回結果,結束流程
6. 若是爲空數據時,則進入進入7 get數據服務管理
7. 由3,6進入到此階段,首先會根據配置的獲取ds信息,這裏是配置了ds1和ds2; 先向ds1請求數據
8. 返回ds1的查詢結果,進入結果判斷;爲空的時候,進入9,不然進入12;這裏demo中設定爲空因此進入9
9. 回到get數據服務管理,讀取ds2的配置信息,進入10
10. 向ds2請求數據
11. 返回ds2的的結果
12. 進入是否須要更新的策略點判斷,不須要更新進入13;須要更新進入14
13. 返回結果,結束流程
14. 將返回的數據更新到dm內部;
15. 進入判斷是否更新到ds的策略點,不更新則進入16;更新進入17
16. 返回結果,結束流程
17. 判斷是不是等待ds同步,若是等待,進入19(等待表示須要到ds更新數據以後才返回結果)。不等待先返回結果18.
18. 返回結果,但並不結束流程。進入19.
19. 進入set數據服務管理器。這裏也定義兩個ds1和ds2。分別會異步的發出20 ds1和21 ds2的更新請求。
22. 當全部ds更新完成後,返回結果,結束流程。
大致流程就介紹到這。下一篇會結合場景和代碼來講明DataManager.