【问题标题】:Xpages Dojo xhrGET chaining load functions of different xhrGETXpages Dojo xhrGET 链接加载不同 xhrGET 的函数
【发布时间】:2015-03-12 17:05:45
【问题描述】:

我有一个有趣的情况。我正在创建一个增强型数据网格(大约 24000 个条目)。因此,我计划加载一个小子集以在另一个请求完成时向用户显示一些数据。你可以在下面的代码中看到我想要做的事情。现在的问题是,“加载”中的这两个函数都将更新网格数据存储。我想确保仅在 createDataStore() 完成后才调用第二个 xhrGet 中的 updateDataStore()。这是必需的,因为我正在为数据存储中的行动态创建 ID。 我不想在第一个 xhrGET 完成之前保留第二个 xhrGET 请求。

** 更新商店的代码**

var ds = dijit.byId("grid").store; ds.newItem();

创建网格并发出两个 xhrGET 请求的代码

CreateEmptyGrid();

dojo.require("dojo._base.xhr");

dojo.xhrGet({
url:"url1",
handleAs:"json",
load: function(data){createDataStore(data);
}
});
dojo.xhrGet(
  {
    url:"url2", 
    handleAs:"json",
    load: function(data){updateDataStore(data);}
});

【问题讨论】:

  • 谢谢斯文。明天试试,让你知道。

标签: dojo xpages dojox.grid.datagrid


【解决方案1】:

这里是 DeferredList

的示例
<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core">

    <xp:scriptBlock id="scriptBlockPromises">
        <xp:this.value><![CDATA[
        require(["dojo/request", "dojo/DeferredList"], function(request, DeferredList) {
            var responses = new Array();

            var promise1 = request("/path/to/data/1").then(function(response) {
                createDataStore(response);
            });

            var promise2 = request("/path/to/data/2").then(function(response) {
                responses[0] = response;
            });

            var list = new DeferredList([promise1, promise2]);
            list.then(function(result) {
                updateDataStore(responses[0]);
            });
        });]]></xp:this.value>
    </xp:scriptBlock>

</xp:view>

【讨论】:

  • Sven,我需要的略有不同。我想确保promise2中的“then”在promise1中的“then”完成之后执行。综合回应在这里对我没有帮助。或者我可能需要更多地了解 deferred 和 promises。我将在这里发布我的发现。
  • 我认为您的问题是您想异步获取数据,然后想以“正确”的顺序应用他们的响应?
  • @Arun:更新我的答案。
  • 它就像 response1 是要在 datagrid 中显示给用户的数据,直到 response2 被加载。我没有切换商店,而是想更新现有的商店并刷新网格。现在的问题是两个异步请求尝试更新相同的存储或数组。由于复杂性或时间表,我今天放弃了使用承诺,但您的示例已经完美地解释了它,现在我期待在我的应用程序中使用它。
  • 哇哦。非常感谢斯文。这正是我想要的。
【解决方案2】:

你可以将第二个请求嵌套在第一个的加载函数中:

CreateEmptyGrid();

dojo.require("dojo._base.xhr");

dojo.xhrGet({ url:"url1", handleAs:"json", load: function(data){
createDataStore(data); 
dojo.xhrGet(   {
    url:"url2", 
    handleAs:"json",
    load: function(data){
        updateDataStore(data);
    } 
}); 
} });

【讨论】:

  • 是的。但是这样第二个请求只会在第一个请求完成后执行。我希望这些 GET 异步。
  • 抱歉,我明白了。您能否在第一个加载方法之外创建空数据存储,以便只在两种加载方法中更新它?
  • 谢谢奥利弗。是的。似乎那是唯一的解决方案。目前,我正在创建一个不同的数据存储,并在加载第二个包含整个数据的请求后进行切换。还要感谢您一直分享的所有 xpages 内容。大粉丝!!
【解决方案3】:

您可以使用全局变量来获取数据存储的状态并定期检查它是否已创建:

CreateEmptyGrid();

dojo.require("dojo._base.xhr");
hasDataStore=false;

dojo.xhrGet({
 url:"url1",
 handleAs:"json",
 load: function(data){ createDataStore(data); hasDataStore=true; }
});
dojo.xhrGet(
  {
    url:"url2", 
    handleAs:"json",
    load: function(data){
      itvCheckDataStore=setInterval(function() {
          if (hasDataStore) {
            clearInterval(itvCheckDataStore);
            updateDataStore(data);
          }
        },256);
    }
});

我没有尝试代码,所以我不能说我是否可能错过了一些右括号。

【讨论】:

  • 我之前也是这么想的。我希望像 dojo deferred 这样的东西可能会有所帮助。但是我只有在添加 xpage 标签时才开始收到回复。向 xpage 社区致敬!!
猜你喜欢
  • 1970-01-01
  • 2011-07-17
  • 2012-04-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多