2017-02-14 28 views
0

我正在製作一個離子應用程序,我想向用戶提供離線功能(即操縱緩存的數據)。存儲和檢索函數及其上下文

例如:用戶嘗試在脫機時更改其個人資料圖片。我被

  1. 做這個改變緩存的用戶配置文件對象第一
  2. 那麼應用程序嘗試更新的雲數據庫的用戶配置文件對象。
  3. 由於沒有互聯網連接,我將存儲函數,其上下文(它所屬的類對象)和參數(如果有)存儲到對象中。
  4. 我將此對象存儲到隊列中。 (我使用這個隊列來存儲之前由於沒有互聯網連接而無法執行的任何其他操作)
  5. 我在我的應用程序中訂閱了「internet OK」事件,我的「連接-service」出版
  6. 當我的同步服務接收它遍歷隊列中的互聯網OK事件和執行的操作,因爲他們應該有

當用戶關閉應用程序,在隊列中的數據丟失等等我必須將它存儲到內存中。這裏的問題是,當我嘗試將隊列對象存儲到緩存(indexDB)時,由於我在隊列中存在對象的循環特性,我得到JSON錯誤。我不確定這是否是保留具有脫機功能支持的應用程序數據的正確方法。我在正確的軌道上嗎?我如何實現離線功能,需要與雲中的數據庫進行交互,並在擁有互聯網後持久保存用戶數據?

我正在考慮將函數的名稱(保存用戶的函數)保存爲一個字符串,對於包含此函數的類也是如此。然後,我可以將邏輯添加到循環部分,在那裏執行這些將調用正確類的正確功能的操作。這看起來像很多工作,因爲我需要登錄才能知道哪個字符串映射到哪個類和哪個函數。

我會使用沙發DB和袋DB,但我很深入我的項目,我不得不重新開始。

let obj = { 
    retry: retry, 
    error:error, 
    function: f, 
    context: context, 
    args: args 
}; 

this.syncService.addToJobsQueue(obj); 

然後在我的同步服務,我做這樣的事情:

subscribeToConnectivityService(){ 
console.log("subscribeToConnectivityService"); 
let me = this; 
me.events.subscribe("connectivity-service-event:internet", (val) => { 
    console.log("connectivity-service-event:internet : " + val); 
    if(val){ 
    me.completeJobsInQueue(); 
    } 
});} 


completeJobsInQueue(){ 
console.log("completeJobsInQueue"); 
let me = this; 
me.localDBStorage.getJobsQueue().then((response) => { 
    if(response==null){response = {}} 
    return response; 
}).then((jobsQueue) => { 
    //clean the jobs queue first 
    me.createEmptyJobsQueue(); 
    for (var key in jobsQueue) { 
     me.executeJob(jobsQueue[key]); 
    } 
}).catch((ex) => { 
    console.error('Error getting jobsQueue from localDBStorage: ', ex); 
    me.createEmptyJobsQueue(); 
});} 

然後我執行這樣的功能:

executeJob(job){ 
    console.log("executeJob"); 
    var f = wrapFunction(job.function, job.context, job.args); 
    (f)(); 
} 

var wrapFunction = function(fn, context, params) { 
    return function() { 
     fn.apply(context, params); 
    }; 
} 

是否有存儲指針類的方式和我想用於緩存的功能?或者我可以實施哪些其他技術而不需要我做出重大改變?

回答

0

好吧,經過一番挖掘,我終於能夠解決這個問題。我做了以下步驟:

1 - 我改變了我的對象(即最終將被存儲到緩存爲JSON)被保存在隊列中,從對象

let obj = { 
    retry: retry, 
    error:error, 
    function: f, 
    context: context, 
    args: args 
}; 

我改變功能和上下文對象只是一個字符串值。對於我的功能,將保存用戶配置文件對象我的簽名「saveUser」和它的上下文類「CloudService」就像儲存在字符串我是這樣的:

obj.context = "saveUser" 
obj.context = "CloudService" 

然後,我擺脫了wrapFunction的,而是我發佈我executeJob函數內部syncServiceEvent爲:

executeJob(job){ 
    this.events.publish("syncServiceExecuteJob", job); 
} 

現在我所有的服務,我希望能提供某種離線功能的支持,我訂閱事件「syncServiceExecuteJob」

events.subscribe("syncServiceExecuteJob", (val) =>{ 
     let me = this; 
     me.syncEventExecuter(val); 
}); 

接下來,我創建一個同步服務事件執行器只是簡單地驗證該服務已接收的事件包含作業都是針對它的,否則會忽略它:

syncEventExecuter(val){ 
    console.log("syncServiceExecuteJob"); 
    console.log(val); 
    if(this.constructor.name == val.context){ 
     this[val.function](val.args); 
    } 
} 

this[val.function](val.args);用正確的參數執行正確的函數陣列。

我仍然不是100%的天氣,這是處理支持脫機功能的應用程序中的數據持久性的正確方法,但目前它似乎正在工作。我沒有很好的教育這個問題,並會喜歡從這裏的專家建議:)