Autor Zpráva
Serg
Profil
Zdravím, z embedded zařízení dostanu binární data, kde je několik různých ArrayBufferů a pár obyčejných proměnných. Jelikož nevím jak převést 32-bitový int na javascriptové číslo, tak z toho vytvořím taky Int32Array() s délkou 1 elementu.
Jenže Blob.arrayBuffer() vytvoří další Promise - což nechápu proč, když ty data už má načtený z předchozích Promise od fetch() a potom Blob(), pak už je to jen věc jak se na ty data kouká (view), ne? - a takle tedy vyvtořím několik Promises ve for cyklu, a potřeboval bych provést nějakou akci, až všechny doběhnou, jde to nějak?

function getDebugData()
{
    const U8 = 0;
    const I32 = 1;
    const F32 = 2;

    const typeSize = [1, 4, 4];
  
    const dataStruct = {
        sample_id:    [I32, 1],
        components:   [I32, 1],
        alarm:        [I32, 1],
        max_temp:     [F32, 1],
        temperatures: [F32, 32 * 24, ir_camera_ctx],
        component_map:[U8, 32 * 24, component_map_ctx]
    };
    let result = {};
  
    fetch('/api/v1/ir_camera/debug', {method: 'GET'})
        .then(response => response.blob())
        .then(data => {

            let offset = 0;
          
            for (let prop in dataStruct)
            {
                let type = dataStruct[prop][0];
                let len = dataStruct[prop][1];
                let ctx = dataStruct[prop][2];
                let size = typeSize[type];
              
                data.slice(offset, len * size + offset).arrayBuffer()
                  .then(bytes => {
                      
                      if (type == I32) result[prop] = new Int32Array(bytes);
                      if (type == U8) result[prop] = new Uint8Array(bytes);
                      if (type == F32) result[prop] = new Float32Array(bytes);
                    
                      if (ctx) draw(ctx, result[prop], (type == F32));
                  });
              
                offset += len * size;
            }
        })
        .then(a => {
            console.log(result['components']); // undefined
            document.getElementById('n_components').innerHTML = '(' + result['components'] + ')';
        });
}
N71
Profil *
Zkusil bych použít Promise.allSettled()
Radek9
Profil
Volat na ten Blob několikrát slice a to potom převádět na ArrayBuffer je zbytečně složité. Zavolej to jen jednou:
fetch('/api/v1/ir_camera/debug', {method: 'GET'})
    .then(response => response.blob())
    .then(blob => blob.arrayBuffer())
    .then(data => {

Následně bude v data rovnou ArrayBuffer a slice bude synchronní operace.
Serg
Profil
Super, to pomohlo, díky

Edit: tak fungují obě možnosti, akorát jak jsem si zkoušel hrát s Promise.allSettled(), tak jsem měl WiFi připojenou k tomu embedded zařízení, pak jsem poslal zprávu aniž by mi djpw řekla že je tu nová zpráva :-D
Zavolání arrayBuffer() na celý blob a pak slice() je opravdu jednodušší, nenapadlo mě, že ArrayBuffer() umí taky slice, děkuju
Radek9
Profil
Serg:
Teď mi došlo, že response má taky metodu arrayBuffer. :-) Ten mezikrok s blobem tedy není nutný:
fetch('/api/v1/ir_camera/debug', {method: 'GET'})
    .then(response => response.arrayBuffer())
    .then(data => {

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0