【问题标题】:$.ajax and IBM Worklight's JSONstore$.ajax 和 IBM Worklight 的 JSONstore
【发布时间】:2014-08-10 00:27:04
【问题描述】:

我正在尝试存储 $.ajax() 函数返回的 json 数据,但遇到了麻烦。下面是我打的电话(我知道它正确地返回了我的 JSON 数据,我已经记录了它(由于个人原因删除了网址)。

$.ajax({
    type: "GET",
    url: **url that returns json data**
    contentType: "application/json; charset=utf-8",
    dataType: "json", 
    success: function(msg) {
        return msg;
    },          
    error: function(e){
      WL.Logger.log(e);
    }
 });

然后我使用 worklight 初始化我的 JSONStore:

//Setup JSON store
var collectionName = 'people';

//Object that defines all the collections
var collections = {};

//Object that defines the 'people' collection
collections[collectionName] = {};

WL.JSONStore.init(collections);

所以现在我遇到了问题。我想将从我的 ajax 调用返回的 JSON 数据添加到我的 JSONStore。所以我尝试了这个(getJSONData 是上面 ajax 调用的包装器):

WL.JSONStore.get(collectionName).add(getJSONData());

但是,当我打印集合时,其中没有存储任何内容,当我打印 WL.JSONStore.get(collectionName).count 时,没有返回任何内容。如何正确添加返回给我的数据?

【问题讨论】:

    标签: json ibm-mobilefirst jsonstore


    【解决方案1】:

    AJAX 调用和 JSONStore API 都是异步 API,这意味着您要么必须使用它们返回的 deferred,要么传递一个成功回调以等待其完成,然后再进行下一步。

    您得到 PERSISTENT_STORE_NOT_OPEN 的原因是您正在调用 init,而不是等待它完成,而是在 init 未完成的情况下立即调用 add,这就是它说存储尚未初始化的原因。

    你可能会这样做:

    $.ajax({
      type: "GET",
      url: **url that returns json data**
      contentType: "application/json; charset=utf-8",
      dataType: "json", 
      success: function(msg) {
          //Setup JSON store
          var collectionName = 'people';
    
          //Object that defines all the collections
          var collections = {};
    
          //Object that defines the 'people' collection
          collections[collectionName] = {};
    
          WL.JSONStore.init(collections)
    
          .then(function(res){
             WL.JSONStore.get(collectionName).add(getJSONData());
          });
    
          return msg;
      },          
      error: function(e){
        WL.Logger.log(e);
      }
    });
    

    (请注意我如何更改成功回调以使用 AJAX 调用的结果。)

    编辑:这里有一些关于 Javascript 中的延迟和承诺的更多信息供参考:http://code.tutsplus.com/tutorials/wrangle-async-tasks-with-jquery-promises--net-24135

    JSONStore 在每次 API 调用时都会返回一个 Promise,这样您就可以使用 Promise 来处理回调,而不必每次都传递成功和失败回调。

    【讨论】:

    • 这似乎奏效了!现在我必须弄清楚如何从我拥有的这个庞大的 JSON 项目列表中获取项目。我用了find,但是我现在登录的时候什么都看不到,只是说[object Object]。
    • 您可能忘记执行 JSON.stringify(object) 将对象转换为可以记录的字符串。
    【解决方案2】:

    您在上面进行的调用是异步的。因此,它可能不会返回您认为的内容。

    你要么必须:

    1. 使用 deferred 等待返回
    2. 将您的 JSONStore 添加命令放入 ajax 调用的成功函数中。
    3. 使用同步标志调用 ajax:jQuery: Performing synchronous AJAX requests

    【讨论】:

    • 谢谢。我尝试将 add 命令放入成功函数中,但现在我得到:[wl.jsonstore] {"src":"store","err":-50,"msg":"PERSISTENT_STORE_NOT_OPEN","col": "人","usr":"jsonstore","doc":{},"res":{}}。不过我已经初始化了商店,所以我很困惑为什么会这样。
    • 我打算在这里回复评论,但我的答案太长了,所以我把它放在一个单独的答案中。基本上,你调用init好像是同步的,但它是异步的,所以当你调用add时,它还没有完成对store的初始化,所以就好像它没有初始化一样。有关详细信息,请参阅我的答案。
    猜你喜欢
    • 2013-08-13
    • 2014-08-07
    • 2015-02-16
    • 2014-10-22
    • 2013-12-27
    • 2014-01-08
    • 2015-06-07
    • 2013-07-18
    • 2013-01-13
    相关资源
    最近更新 更多