我有以下几点:
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文档,并传递给:
问题是,到达fetchXml时,cacheDOM是未定义的,这导致函数之类的selectNode之类的方法出现问题。
我没有太多接触过xhr电话或诸如延期或承诺之类的事情,但是我认为他们也许可以提供帮助。我该如何编码,以便仅在cacheDOM已分配dom值的情况下执行此块所在的方法的其余部分?或者,如果答案是延期,我将如何将其合并到此代码中?我正在使用的dojo版本是1.7.8
最佳答案
好吧,问题确实出在您正在使用异步的XHR请求。因此,fetchXml
函数必须等待该请求完成。
有几种方法可以执行此操作,您可以从fetchXml
的load
函数中调用dojo.xhrPut
函数,但是当您的项目扩展时,这并不是一个很好的解决方案,因为它相互之间创建了很多依赖关系。
因此,一些聪明的人创建了一个用于解决异步请求的API,称为promises / deferreds。
因此,您要做的就是为cacheDOM
分配一个新的延迟,例如:
require(["dojo/_base/Deferred"], function(Deferred) {
cacheDOM = new Defered();
});
然后,在
fetchXml()
代码中,您必须稍微更改代码才能执行此操作:function fetchXml() {
cacheDOM.then(function(realCache) {
console.log(realCache);
});
}
因此,必须直接使用
cacheDOM
来代替直接使用cacheDOM.then()
。解析后将触发回调,并且数据将在realCache
中可用。一种替代方法是在XHR请求触发后调用整个fetchXml函数:
cacheDOM.then(fetchXml);
function fetchXml(cacheDOM) {
// Work with cacheDOM
}
根据
fetchXml
的依赖程度,这可能需要较少的工作和对cacheDOM
函数的更改较少。最后,在
dojo.xhrPut
中,您必须执行以下操作:cacheDOM.resolve("My data");
其中
"My data"
是要放入cacheDOM
中的实际数据。演示:http://jsfiddle.net/rf20s9hb/1/
关于javascript - Dojo-变量分配在xhrPut中发生得太晚,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30375081/