gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 10:05:33 25 4
gpt4 key购买 nike

我有以下内容:

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 调用,或者诸如延期或 promise 之类的东西,但我认为他们可能能够在这方面提供帮助。我该如何编码,以便该 block 所在的方法的其余部分仅在cacheDOM已被分配了dom的值时才执行?或者,如果延迟是答案,我如何将它们合并到此代码中?我使用的dojo版本是1.7.8

最佳答案

嗯,问题确实是您正在使用异步的 XHR 请求。因此,fetchXml 函数必须等待该请求完成。

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

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

因此,您要做的就是为 cacheDOM 分配一个新的 deferred,例如:

require(["dojo/_base/Deferred"], function(Deferred) {
cacheDOM = new Defered();
});

然后,在 fetchXml() 代码中,您必须稍微更改代码才能执行此操作:

function fetchXml() {
cacheDOM.then(function(realCache) {
console.log(realCache);
});
}

因此,您必须使用 cacheDOM.then() 等待它,而不是直接使用 cacheDOM。解决后它将触发回调,并且数据将在 realCache 中可用。

另一种方法是在 XHR 请求触发时调用整个 fetchXml 函数:

cacheDOM.then(fetchXml);

function fetchXml(cacheDOM) {
// Work with cacheDOM
}

这可能需要更少的工作,并且对 fetchXml 函数的更改也更少,具体取决于它对 cacheDOM 的依赖程度。

最后,在您的 dojo.xhrPut 中,您必须执行以下操作:

cacheDOM.resolve("My data");

其中“我的数据”将是您将放入cacheDOM中的实际数据。

演示:http://jsfiddle.net/rf20s9hb/1/

关于javascript - Dojo - xhrPut 中变量赋值发生得太晚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30375081/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com