这是提取一些十六进制数据、解释它并将其打印到 console.log 的代码。它在 'req' 循环中有效,但在外部无效。为什么?

Here is code to extract some hex data, interpret it and print it to console.log.. it works while in the 'req' loop, but not outside. why?

这里有一些工作代码可以提取一些十六进制数据,对其进行解释并将其打印到 console.log.. 它在 'req' 循环中有效,但在循环之后无效。为什么?

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <script src="js-struct.js"></script>

    <script>
    // Question: does the onload stuff happen last that could be why the struct is zero.

var zebuffer = new ArrayBuffer(128);
var inputter = new Int8Array(zebuffer);

var url = "data.bin";

var req = new XMLHttpRequest();
req.open("GET", url, true);
req.responseType = "arraybuffer";

if( req.overrideMimeType ) {
    req.overrideMimeType('text/plain; charset=x-user-defined');
} 
else {
    req.setRequestHeader('Accept-Charset', 'x-user-defined');
}


req.onload = function (ev) {
var arrayBuffer = req.response; // Note: not oReq.responseText
  if (arrayBuffer) {
    var byteArray = new Int8Array(arrayBuffer);
        for (var i = 0; i < byteArray.byteLength; i++) {
    // do something with each byte in the array

                inputter[i] = byteArray[i];

            }


var SimpleStruct = Struct.create(
            Struct.int32("x"),
            Struct.int32("y"),
            Struct.int32("z"),
            Struct.int32("blank")
 ); 

var b = SimpleStruct.readStructs(zebuffer, 0, 2);

//console.log("zebuffer = "+zebuffer);
//console.log("inputter = "+inputter[0]);

console.log("b[1].x = "+b[1].x);        
console.log("b[1].y = "+b[1].y);
console.log("b[1].z = "+b[1].z);
console.log("b[1].blank = "+b[1].blank);
console.log("------------------------------------------------");    

   }

};

req.send(null);



    </script>
</head>
<body>
    <p>Seamus! open the browser console</p>
</body>

data.bin 只是一个抽象样本二进制数据文件,有两组四个 int32 可供读取。代码读取第二组四个 int32。

FF FF FF 3F FF FF FF 3F FF FF FF 3F FF FF FF 7F 
1A 1A 1A 1A FF FF FF 3F 00 00 00 7F FF FF FF 1F

所以我的问题是为什么我不能读取 zebuffer,使用 Simplestruct 函数获取所需的数据并以十进制格式打印它以在 req.onload 和 req.send(null) 之间的任何地方进行控制台功能?

我怀疑是因为 onload 函数中的代码总是最后发生,因此任何控制台打印都会在数据读入 zebuffer 之前首先发生。有没有办法解决?例如,我能否以某种方式调用一个函数来获取数据并返回到脚本,然后它 console.logs 它(或者我想用名为 b[] 的 int32 数组做的任何其他事情)如果可能的?

onload函数是在请求加载完成后执行的,那数据自然是在请求发送后才可用。 "send" 是异步的,所以 "send" 之后的代码会立即执行,不会等到发送完成。您需要在检索到数据后继续您的程序流程,换句话说,在 onload 事件处理程序中。

 Is there any way around this? e.g Can i somehow call a function which gets the data and comes back to the script and then it console.logs it

您想避免这种行为有什么特别的原因吗?您可以在 onload 中继续您的程序,或者您可以将数据传递给 onload 中的其他函数

req.onload = function (ev) {
    var arrayBuffer = req.response; // Note: not oReq.responseText
    if (arrayBuffer) {
        var byteArray = new Int8Array(arrayBuffer);
        for (var i = 0; i < byteArray.byteLength; i++) {
            inputter[i] = byteArray[i];
        }
        var SimpleStruct = Struct.create(Struct.int32("x"), Struct.int32("y"),  Struct.int32("z"), Struct.int32("blank")); 
        var b = SimpleStruct.readStructs(zebuffer, 0, 2);
        myNewFunction(b) //pass your data on to some other function
    }
}

function myNewFunction(data) {
    //do things with 'data'
}

req.send()

如果您真的需要它是同步的(相对于异步),您可以按照描述发送它at the end of this article,其中也描述了上述行为