0

我有以下内容:

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 的值时才执行?或者如果延迟是答案,我将如何将它们合并到此代码中?我使用的道场版本是1.7.8

4

1 回答 1

1

好吧,问题确实是您使用的是异步的 XHR 请求。因此,该fetchXml函数必须等到该请求完成。

有几种方法可以做到这一点,您可以fetchXml从 的load函数中调用该函数dojo.xhrPut,但是当您的项目增长时,这并不是一个很好的解决方案,因为它会产生很多相互依赖。

因此,一些聪明人创建了一个用于解决异步请求的 API,称为 promises/deferreds。

因此,您要做的就是分配一个新的 deferred to 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/

于 2015-05-21T14:07:02.683 回答