| Autor | Zpráva | ||
|---|---|---|---|
| Serg Profil |
#1 · Zasláno: 27. 6. 2023, 11:54:00
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 * |
#2 · Zasláno: 27. 6. 2023, 15:36:28
Zkusil bych použít Promise.allSettled()
|
||
| Radek9 Profil |
#3 · Zasláno: 27. 6. 2023, 17:18:50
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 => { |
||
|
Časová prodleva: 3 roky
|
|||
0