我正在製作一個離子應用程序,我想向用戶提供離線功能(即操縱緩存的數據)。存儲和檢索函數及其上下文
例如:用戶嘗試在脫機時更改其個人資料圖片。我被
- 做這個改變緩存的用戶配置文件對象第一
- 那麼應用程序嘗試更新的雲數據庫的用戶配置文件對象。
- 由於沒有互聯網連接,我將存儲函數,其上下文(它所屬的類對象)和參數(如果有)存儲到對象中。
- 我將此對象存儲到隊列中。 (我使用這個隊列來存儲之前由於沒有互聯網連接而無法執行的任何其他操作)
- 我在我的應用程序中訂閱了「internet OK」事件,我的「連接-service」出版
- 當我的同步服務接收它遍歷隊列中的互聯網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);
};
}
是否有存儲指針類的方式和我想用於緩存的功能?或者我可以實施哪些其他技術而不需要我做出重大改變?