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() {

我给出了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() {
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);