1 回答
TA贡献1852条经验 获得超7个赞
更新:onreadystatechange
更正了和的一些措辞readyState
。
你打开或关闭东西的技巧是一个好主意,尽管我不确定它是否有效或安全。无论如何,您所显示的代码的直接问题是它没有考虑您正在使用异步请求的事实。
您的代码按照编写的顺序运行,但异步请求不会阻止执行,因此第二个XMLHttpRequest
tourl
几乎立即触发,并且早在第一个Transition()
完成之前就触发了。
如果您需要事情按顺序发生,则需要从请求onreadystatechange
事件处理程序调用后续步骤,该事件处理程序会在请求状态更改时触发。代码已经测试了readyState 4
,这意味着请求已完成。因此,请求完成后,调用的代码就会运行。
我不确定你的一些代码在做什么,也许它是在上下文之外复制的(例如你的callback
, and是什么doNothing
?)。
这是一个基于您的代码的工作 JSFiddle,对所有 3 个请求使用虚拟 URL。我已经包含了一堆日志记录,打开您的开发控制台以查看事件启动、运行和完成的顺序。
这个想法是将回调传递给第一个Transition
,该回调将在请求完成后被触发:
function downloadUrl() { Transition(foo); }
Transition
将回调作为参数,并在完成时触发它:
function Transition(callback) {
// ... your code ...
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == 4) {
if (callback) {
callback();
}
}
};
// ... your code
}
这foo()是一个实际下载 的函数url,基本上是您所拥有的所有内容downloadUrl(),但不调用Transition.
完成后foo(),您需要Transition再次调用,但这次我们不想在完成后触发任何内容,因此我们通过false,这Transition将测试并跳过尝试执行。
我写得很快,感觉有点笨拙,您可能可以稍微修改一下以使其更整洁,但它演示了使用事件处理程序通过异步请求顺序执行操作的基本思想。
- 1 回答
- 0 关注
- 79 浏览
添加回答
举报