Xpages Dojo Xhret链接不同Xhret的加载函数

Xpages Dojo Xhret链接不同Xhret的加载函数,dojo,xpages,dojox.grid.datagrid,Dojo,Xpages,Dojox.grid.datagrid,我有一个有趣的情况。我正在创建一个增强的Datagrid(大约有24000个条目)。所以我计划加载一个小子集,在另一个请求完成时向用户显示一些数据。您可以在下面的代码中看到我正在尝试做什么。现在的问题是,“load”中的这两个函数都将更新网格数据存储。我想确保只有在createDataStore()完成后,才调用第二个xhrGet中的updateDataStore()。这是必需的,因为我正在为数据存储中的行动态创建ID。 我不想在第一个Xhret完成之前保留第二个Xhret请求。 **更新存储的

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

**更新存储的代码**

var ds=dijit.byId(“网格”).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);}
});

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

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

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

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);
    }
});
我没有尝试代码,所以我不能说是否遗漏了一些右括号。

这里是一个带有延迟列表的示例



是。但这样,第二个请求只会在第一个请求完成后执行。我想让它们异步。啊,对不起,我明白了。您能否在第一个加载方法之外创建空数据存储,以便只在两个加载方法中更新它?谢谢Oliver。对看来这是唯一的解决办法。目前,我正在创建一个不同的数据存储,并在加载整个数据的第二个请求时进行切换。同时感谢您一直分享的所有xpages内容。大粉丝!!我之前也是这么想的。我希望类似dojo的东西可能会有所帮助。但我只有在添加xpage标记时才开始收到响应。向xpage社区致敬!!谢谢你,斯文。我明天会试试,让你知道。斯文,我需要的是稍微不同的。我想确保允诺2中的“然后”在允诺1中的“然后”完成后执行。在这方面,统一的回应无助于我。或者我需要更多的理解和承诺。我将在这里发布我的发现。我想你的问题是,你想异步获取数据,然后想以“正确”的顺序应用它们的响应?@Arun:更新我的答案。就像response1是在加载response2之前在datagrid中向用户显示的数据一样。我没有切换商店,而是想更新现有的商店,只是刷新网格。现在的问题是两个异步请求试图更新同一个存储或数组。由于复杂性或时间限制,我今天放弃了使用承诺,但您的示例已经很好地解释了这一点,现在我期待在我的应用程序中使用相同的承诺。噢,哇。非常感谢斯文。这正是我想要的。
<?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>