【问题标题】:Worklight 6.2 JSONStore issues on iOSiOS 上的 Worklight 6.2 JSONStore 问题
【发布时间】:2014-09-08 12:57:06
【问题描述】:

自从我更新到 WL6.2 后,我在 iOS (7.1.1) 上遇到了 JSONStore 问题。我的应用程序中有很多意外行为。我创建了一个测试应用程序来指示我的一些问题。只需创建一个新的 WL 项目并替换 main.js 文件并在 index.html 中添加一些按钮。

index.html:

<button id="destroyJSONStore">Destroy JSON Store</button>
<button id="search">Search</button>
<button id="load">Load</button>

main.js:

function wlCommonInit(){
    document.getElementById("destroyJSONStore").onclick=function(){
        WL.JSONStore.destroy()
        .then(function() {
            alert("JSON Store Destroyed");
        });
    };

    document.getElementById("search").onclick=function(){
        var query = {UserID: 1};
        WL.JSONStore.get("Users").find(query)
        .then(function(res) {
            alert("Number of users found with ID 1: " + res.length);
        })

        .fail(function(errorObject) {
            alert("Error loading user: " + userId + "\n" + errorObject.msg);
        });
    };

    document.getElementById("load").onclick=function(){
        var data = [{UserID: 1, Login: 'hvb'}];
        var addOptions = {markDirty: true};

        WL.JSONStore.get("Users").add(data, addOptions)
        .then(function(added) {
            alert("User successfully added; " + added);
        })
        .fail(function (errorObject) {
            alert(errorObject.toString());
        });
    };

    var collections = {
        Persons : {
            searchFields : {name: 'string', age: 'integer'}
        }
    };

    var collections2 = {
        Users : {
            searchFields: { UserID: 'integer', Login: 'string'}
        }
    };

    var options = {
      username : 'jos',
      password : 'jos',
      localKeyGen : true
    };

    WL.JSONStore.init(collections, options)
    .then(function () {
        WL.Logger.debug("init persons ok");
    })
    .fail(function (errorObject) {
        alert(errorObject.toString());
    });

    WL.JSONStore.init(collections2, options)
    .then(function () {
        WL.Logger.debug("init Users ok");
    })
    .fail(function (errorObject) {
        alert(errorObject.toString());
    });           
}

应用程序第一次加载一切正常,如果您点击加载,则会在商店中添加一个新文档,如果您点击搜索,则会显示商店中的文档数量。然而,当我开始玩这个应用程序时,事情就出错了。关闭并打开应用程序几次并添加新文档。一段时间后,您会注意到搜索会不断返回相同数量的文档(无论您单击添加多少次)。

您还会注意到,一旦您销毁 json 存储并重新打开您的应用程序,您就会得到一个 JSON_STORE_DATA_PROTECTION_KEY_FAILURE。您必须再次重新启动应用程序才能摆脱它。

谁能告诉我我做错了什么? 我承认两次初始化 JSONSstore 可能看起来有点奇怪。但这是因为我们的应用程序是使用不同的模块构建的,并且在配置方面加载了不同的模块。根据文档,这不会导致任何问题:

可以使用不同的集合进行多次初始化。新集合的初始化不会影响已经初始化的集合。

顺便说一句:该应用在 Android 和移动浏览器模拟器上按预期运行。

【问题讨论】:

  • 我不知道这是否是导致您的问题的原因,但是在您的代码中,您应该在第一个 init 之后的 then() 回调中执行第二个 init;否则,由于 JSONStore 是一个异步 API,它可能会导致奇怪的行为。您实际上可以简化此操作并同时初始化两个集合;只需将数组中的两个集合对象都传递给 init(即 init([collections, collections2], options)),它应该可以工作并使您更简单。
  • Daniel,你的话很有道理,我已经确信这会解决我的问题。我已经修改了我的代码,现在第二个 JSONStore 仅在第一个的 init 完成后才被初始化。但问题仍然存在。我知道我也可以一次完成两个集合的初始化,这可能会解决我的问题。但如前所述,我宁愿为不同的模块保留初始化。
  • Daniel,我已经测试了您的解决方法,事实上,如果我一次性初始化集合,这两个问题都得到了解决。但这只是一种解决方法,如果我两次初始化集合,它也应该可以工作。
  • 好的,让我调查一下,看看能否重现该问题。
  • 丹尼尔,我的承诺有问题,你是对的。问题是由于两个 init 语句同时执行。当我在 init 语句之间添加超时时,问题就消失了。我会更新我的问题并添加一个答案。感谢您的支持。

标签: ios ibm-mobilefirst jsonstore


【解决方案1】:

正如 Daniel 所建议的,问题在于两个 init 方法同时执行。这会导致奇怪的行为。解决方案是在第一个 init 完成后调用第二个 init。以下是如何做到这一点的示例。

WL.JSONStore.init(collections, options)
.then(function () {
    WL.Logger.debug("init persons ok");
})
.then(function() {
    WL.JSONStore.init(collections2, options)
   .then(function () {
       WL.Logger.debug("init Users ok");
   })
   .fail(function (errorObject) {
       alert(errorObject.toString());
   });
})
.fail(function (errorObject) {
    alert(errorObject.toString());
});

【讨论】:

  • 看来第一个 .then() 不应该在那里;承诺应该在我认为的第二个解决,所以我认为这可能只是一个错字。
【解决方案2】:

我想我知道问题出在哪里;您在 destroy() 调用后显示警报,并认为看到警报意味着销毁已完成,但事实并非如此; destroy() 也是一个异步 API 调用,因此像 init 一样,您必须使用 promises/callbacks 来执行警报。例如:

WL.JSONStore.destroy()
.then(function(){
     alert('Destroy is done!');
});

【讨论】:

  • 这确实是我犯的一个错误,但我认为这与我的问题无关。在我看来,唯一的影响是警报显示得太快了。
  • 我已经用您的评论更新了我的问题,但 JSON_STORE_DATA_PROTECTION_KEY_FAILURE 异常仍然存在。
猜你喜欢
  • 2014-05-22
  • 2013-12-27
  • 2016-09-24
  • 2016-01-05
  • 2014-05-11
  • 2014-10-19
  • 2014-10-30
  • 2013-01-13
  • 1970-01-01
相关资源
最近更新 更多