Dojo - 变量赋值在xhrPut中发生得太晚了

时间:2015-05-21 13:23:58

标签: javascript dojo dojo-1.7

我有以下内容:

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

1 个答案:

答案 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"内的实际数据。

DEMO:http://jsfiddle.net/rf20s9hb/1/