存储和检索函数及其上下文

时间:2017-02-14 21:56:43

标签: json caching local-storage persistence

我正在创建一个离子应用程序,我希望为用户提供离线功能(即操纵缓存的数据)。

例如:用户在离线时尝试更改其个人资料照片。我是通过

这样做的
  1. 首先更改缓存的用户个人资料对象
  2. 然后应用程序尝试更新云数据库中的用户配置文件对象。
  3. 由于没有互联网连接,我存储了保存功能,它的上下文(它所属的类对象)和参数(如果有的话)。
  4. 我将此对象存储到队列中。 (我正在使用此队列来存储之前由于没有互联网连接而无法执行的任何其他操作)
  5. 我在我的应用中制作了一个“同步服务”,订阅我的“连接服务”发布的“互联网确定”事件
  6. 当我的同步服务收到互联网OK事件时,它会循环遍历队列并执行应有的操作
  7. 当用户关闭应用程序时,队列中的数据会丢失,因此我必须将其存储到内存中。这里的问题是当我尝试将队列对象存储到缓存(indexDB)时,我得到了JSON错误到期到我队列中的物体的圆形性质。我不确定这是否是为具有脱机功能支持的应用程序保留数据的正确做法。我是在正确的轨道上吗?如果我有互联网,如何实现需要与云中的数据库进行交互的离线功能以及持久的用户数据?

    我只想将函数的名称(保存用户的函数)保存为字符串,并且对于包含此函数的类也是如此。然后我可以在循环部分添加逻辑,我正在执行这些操作,这些操作将调用正确类的正确函数。这似乎是很多工作,因为我需要登录才能知道哪个字符串映射到哪个类和哪个函数。

    我会使用沙发数据库和小袋数据库,但我很喜欢我的项目,我将不得不重新开始。

    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);
        };
    }
    

    有没有办法存储指向我想用于缓存的类和函数的指针?或者我可以实施的任何其他技术,不需要我做出重大改变?

1 个答案:

答案 0 :(得分: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%的天气,这是在支持离线功能的应用程序中处理数据持久性的正确方法,但现在它似乎正在运行。我在这方面没有受过良好的教育,并希望来自专家的建议:)