我有以下内容:
if(typeof searchDOM === "undefined"){
dojo.xhrPut({
url: addrPath + "/ContServlet?mod=1&act=23",
handleAs: "xml",
timeout: xhrTimeout(TIMEOUT_LRG),
load: function(dom, ioArgs){
if(dom instanceof Error){
console.error(dom);
} else{
cacheDOM = dom;
}
},
error: function(response, ioArgs){
xhrError(ioArgs, methodName);
}
});
}
变量cacheDOM是另一个脚本中其他地方声明(但未初始化)的全局变量。它是一个包含整个dom的xml文档,它被传递到:
问题是,当cacheDOM到达fetchXml时,它是未定义的,这会导致函数中的selectNode等方法出现问题。
我没有太多接触xhr电话,或延期或承诺等事情,但我认为他们可以帮助解决这个问题。我如何对此进行编码,以便该块所在的方法的其余部分只有在cacheDOM被赋值为dom时才会执行?或者如果延迟是答案,我将如何将它们合并到此代码中?我使用的dojo版本是1.7.8
答案 0 :(得分:1)
嗯,问题确实是您正在使用异步的XHR请求。因此,fetchXml
函数必须等到该请求完成。
有几种方法可以执行此操作,您可以在fetchXml
的{{1}}函数中调用load
函数,但当项目增长时,这不是一个很好的解决方案,因为它会相互产生很多依赖关系。
因此,一些聪明人创建了一个用于解析异步请求的API,称为promises / deferreds。
因此,您需要做的是将新的延迟分配给dojo.xhrPut
,例如:
cacheDOM
然后,在require(["dojo/_base/Deferred"], function(Deferred) {
cacheDOM = new Defered();
});
代码中,您必须稍微更改代码才能执行此操作:
fetchXml()
因此,您无需直接使用function fetchXml() {
cacheDOM.then(function(realCache) {
console.log(realCache);
});
}
,而是必须使用cacheDOM
等待它。它会在解决后触发回调,数据将在cacheDOM.then()
中提供。
另一种方法是在XHR请求被触发时调用整个fetchXml函数:
realCache
这可能会减少cacheDOM.then(fetchXml);
function fetchXml(cacheDOM) {
// Work with cacheDOM
}
函数的工作量和更改次数,具体取决于fetchXml
依赖的程度。
最后,在cacheDOM
内,您必须执行以下操作:
dojo.xhrPut
cacheDOM.resolve("My data");
将是您放在"My data"
内的实际数据。