我有一个 div 标记,它有一个触发dojo XHR请求的OnClick事件。
我的问题是它不会进入 .then(lang.hitch(...))部分,除非我在 firebug中使用断点
createTS : function(){
var container = document.createElement("div");
console.log("Hallo World");
xhr("getoptions.php?database=cb_content.sqlite&order=read").then(lang.hitch(this,function(result){console.og("test");this.temp = result.toString().split(";");}));
var container = document.createElement("div");
for(var i = 0; i< this.temp.length; i++){
var span = document.createElement("span");
span.setAttribute("id",this.temp[i]);
span.innerHTML = this.temp[i];
//on(dom.byId(this.temp[i]),"click",this.foo(span.innerHTML));
span.setAttribute("class","apus_span_item");
span.setAttribute("onclick","fptr('"+span.innerHTML+"');");
container.appendChild(span);
container.appendChild(document.createElement("br"));
}
console.log("row before return");
return '<div>'+container.innerHTML+'</div>';
//return this.templateString2
},
控制台告诉我“Hallo World”然后它告诉我发出GET请求,然后控制台告诉我“返回前的行”。但是“测试”将不会被写入。
当我打破分数时,它会告诉我测试。
任何人都有答案为什么它不会进入.then?
问候
答案 0 :(得分:1)
除了您的代码有console.og()
之类的错误而不是console.log()
之外,您的设置将无法正常运行。
您尝试在同步代码(this.temp
)内使用由异步请求(XHR请求是什么)设置的值。
因此,创建HTML(for
循环)的代码很可能正在执行 BEFORE XHR请求已完成,因此,{ {1}}已初始化。
它在使用断点时起作用的原因是因为您要在XHR完成之前延迟HTML创建代码(因为您设置了断点)。
这里有两个解决方案。第一种方法是将this.temp
选项设置为sync
,将XHR请求转换为同步请求。有关详细信息,请查看reference guide或API documentation。
另一种解决方案是确保只在异步请求完成时才执行创建HTML的代码。你可以通过在回调中移动所有依赖true
的代码(this._temp
部分内的函数)来实现这一点。
但是,如果您需要从回调中返回一些内容,则必须使用deferreds。