XMLHttpRequest 事件监听器的执行顺序

XMLHttpRequest event listeners order of execution

我有代码使用 XMLHttpRequest 检索一些数据,看起来像这样:

var myObject = new MyObject();
var req = new XMLHttpRequest();

req.addEventListener("load", function () {
    myObject.data = req.responseText;
}, false);

req.addEventListener("loadend", function () {
    myObject.save();
}, false);

req.open("GET", "http://www.example.com/foo.txt", true);
req.send(null);

基本上,如果Ajax请求成功,我想保存myObject中检索到的数据,然后不管Ajax请求的状态如何,我都想保存myObject 到数据库。到目前为止,它按预期工作,但我对 loadloadend 侦听器的执行顺序有些不安。我能找到的最多的是 XMLHttpRequest living standard(关于 loadend):

After one of error, abort, timeout or load has been dispatched.

这是否保证如果 Ajax 请求成功,load 侦听器将 完成 loadend 侦听器 开始?

order of execution of the load and loadend listeners

正如您可以从 the standard 判断的那样,loadend 将始终在 load 或相应的错误事件之后调度。

Does this guarantee that if the Ajax request succeeds, that the load listener will finish executing before the loadend listener starts?

JavaScript 是单线程的,有一个 运行-to-completion 事件循环。两个听众永远不会同时运行。