Javascript执行代码顺序
我给出了Javascript的第一步,并试图理解它是如何工作的。 我遇到了代码执行顺序的问题Javascript执行代码顺序,javascript,ajax,asynchronous,xmlhttprequest,Javascript,Ajax,Asynchronous,Xmlhttprequest,我给出了Javascript的第一步,并试图理解它是如何工作的。 我遇到了代码执行顺序的问题 var Parsed = [[]] var txtFile = new XMLHttpRequest(); alert("Trying to open file!"); txtFile.open("GET", "http://foo/f2/statistics/nServsDistrito.txt", false); txtFile.onreadystatechange = function() {
var Parsed = [[]]
var txtFile = new XMLHttpRequest();
alert("Trying to open file!");
txtFile.open("GET", "http://foo/f2/statistics/nServsDistrito.txt", false);
txtFile.onreadystatechange = function() {
if (txtFile.readyState === 4) { // Makes sure the document is ready to parse.
if (txtFile.status === 200) { // Makes sure it's found the file.
alert("File Open");
allText = txtFile.responseText;
Parsed = CSVToArray(allText, ",")
}
}
}
txtFile.send(null);
alert("Job Done");
问题是“工作完成”比“文件打开”先出现
但该文件包含“作业已完成”警报后代码所需的信息。
我更改了“get”请求的异步部分,但不起作用
当文件打开并检索信息时,我可以做些什么来支持所有代码?
在打开和解析文件时,是否可以使用readyState暂停代码
谢谢你的帮助
更新:多亏了大家,它现在可以工作了 这是因为您使用的是异步函数。使用异步函数时,必须使用回调
回调是一个函数(例如
函数cback()
),作为参数传递给另一个函数(例如函数async()
)。嗯,cback
将在必要时由async
使用。例如,如果您正在执行IO操作,如读取文件或执行SQL查询,则在检索到数据后,可以使用回调来处理数据:
asyncOperation("SELECT * FROM stackoverflow.unicorns", function(unicorns) {
for(var i=0; i<unicorns.length; i++) {
alert("Unicorn! "+unicorns[i].name);
}
});
该警报将在查询完成和unicorns出现之前显示
因此,如果您想在异步任务完成后执行操作,请在回调中添加该代码:
asyncOperation("SELECT * FROM stackoverflow.unicorns", function(unicorns) {
for(var i=0; i<unicorns.length; i++) {
alert("Unicorn! "+unicorns[i].name);
}
//add here your code, so that it's not executed until the query is ready
});
这里我们使用两个回调,一个用于处理数据,另一个用于在发生错误时调用(当然这取决于
asyncOperation
的工作方式,每个异步任务都有自己的回调)。XMLHttpRequest
是一个异步操作。无论您的文件是否随时可用,或者即使不涉及网络,这都无关紧要。因为它是一个异步操作,所以它总是在任何顺序/同步代码之后执行。这就是为什么您必须声明一个回调函数(onreadystatechange
),当open
返回文件内容时将调用该函数
根据上面的解释,本例中的代码是不正确的。警报
行将立即执行,而不是等待文件内容准备就绪。只有在执行完onreadystatechange
后,作业才会完成,因此您必须将警报
放在onreadystatechange
的末尾
触发异步操作的另一种非常常见的方法是使用setTimeout
,这将强制异步执行其回调函数。看看它是如何工作的
编辑:通过将第三个参数设置为
open
设置为false
(),您确实在强制请求同步。但是,在很少的情况下,您希望这样的请求是同步的。考虑是否需要它是同步的,因为在文件被读取之前,您将阻塞整个应用程序或网站。 XMLHTTPREQUEST是异步的,打开将与您的函数并行执行(并且当您的函数完成其任务以保持代码“单线程”时,将执行OnRead StyEnchange)。。将最后3个}
移到最底部。如果请求是同步的,那么事件处理程序有什么用处?将事件处理程序中的代码移动到.send
和alert(done)
之间。请查看事件处理程序的第一部分。它试图解释同步代码和异步代码之间的区别。尝试在txtFile.open()方法中将“false”替换为“true”,然后运行它。你会感觉到不同。请尝试像上面人们说的那样做,但使同步调用xmlhttprequest不一定是异步的不是一个好的实践。.open
中的第三个参数可以设置为false以使其同步。感谢您的响应和解释!:)不客气。一旦您了解了sync/async是如何工作的,就来看看这个:这里有一些有用的例子
asyncOperation("SELECT * FROM stackoverflow.unicorns", function(unicorns) {
for(var i=0; i<unicorns.length; i++) {
alert("Unicorn! "+unicorns[i].name);
}
//add here your code, so that it's not executed until the query is ready
});
function handleData(unicorns) {
//handle data... check if unicorns are purple
}
function queryError(error) {
alert("Error: "+error);
}
asyncOperation("SELECT * FROM stackoverflow.unicorns", handleData, queryError);