我有以下几点:

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函数必须等待该请求完成。

有几种方法可以执行此操作,您可以从fetchXmlload函数中调用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/

10-09 13:54