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: 10 měsíců
|
0