我有一个有趣的情况。我正在创建一个增强的数据网格(大约24000个条目)。因此,我计划加载一个小子集,以便在另一个请求完成时向用户显示一些数据。你可以在下面的代码中看到我想要做的事情。现在的问题是,这两个功能都在" load"将更新网格数据存储区。我想确保在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);}
});
答案 0 :(得分:3)
这是 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>
答案 1 :(得分:1)
您可以将第二个请求嵌套在第一个请求的加载函数中:
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);
}
});
} });
答案 2 :(得分:0)
您可以使用全局变量来获取数据存储的状态,并定期检查它是否已创建:
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);
}
});
我没有尝试代码,所以我不能说我是否可能错过了一些左右括号。