Вот код для извлечения некоторых шестнадцатеричных данных, их интерпретации и печати в console.log. Он работает в цикле 'req', но не снаружи. Зачем?

Вот некоторый рабочий код для извлечения некоторых шестнадцатеричных данных, их интерпретации и печати в 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 всегда происходит последним, так что любые консольные распечатки выполняются первыми, прежде чем данные будут прочитаны в зебуффер. Есть ли способ обойти это? Например, могу ли я как-нибудь вызвать функцию, которая получает данные и возвращается в сценарий, а затем это console.logs (или все, что я хочу сделать с массивом int32 с именем b[]), как я могу это сделать, если это возможно?

1 ответ

Решение

Функция 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()

Если вам действительно нужно, чтобы он был синхронным (в отличие от асинхронного), вы можете отправить его, как описано в конце этой статьи, где также описано вышеупомянутое поведение

Другие вопросы по тегам