Javascript: Как использовать буфер массива с представлениями для отправки передаваемых объектов
Допустим, у меня есть массивы под названием
(Arr1,Arr2)
и первый массив имеет 2000 объектов, которые имеют следующие
{Cyclic:my.parent,string:"imAString",int:10,Position:{bunchofints}}
скажем, я хотел определить Arr2 как
for (i in arr1){let arr1[i]= currentObject arr2.push(currentObject.Position)}
затем для отправки arr2 веб-работнику.
это цель, и мне было интересно, как мне поступить, сначала отправить и получить доступ к первому массиву, а затем - другому. это и ik есть буферы массива, которые могут быть определены, тогда из буфера может быть сделано представление данных, но я понятия не имею, как бы вы отправили то, что у меня есть выше, работнику, учитывая, что я не знаю, что требуется для отправки буфер и как добавить необходимые ограничения, такие как длина байта. Я видел сообщение, что парень использовал что-то вроде
var arrayBuffer = new ArrayBuffer("?what should go here");
var data = new DataView(arrayBuffer);
var tempArray = new Float32Array(data.byteLength/Float32Array.BYTES_PER_ELEMENT);
это на линии создания того, что я хочу, и если нет, как я могу получить передачу моих объектов работнику, спасибо, что взорвали.
PS: причина, по которой я создал эту ветку, состоит в том, чтобы упростить уже существующую информацию, которая, на мой взгляд, была немного общей и неприветливой для новых людей
1 ответ
Ты можешь использовать JSON.stringify()
преобразовать простой объект JavaScript в строку TextEncoder()
.encode()
метод для преобразования строки в Uint8Array
, проходить Uint8Array
.buffer
свойство второго параметра postMessage()
, затем delete
исходный объект, определенный как свойство window
или другой объект.
В Worker
использование потока TextDecoder()
.decode()
метод и JSON.parse()
получить переданный объект. Определите объект как свойство Worker
объект внутри message
событие.
Выполните ту же задачу преобразования объекта в строку и преобразования в TypedArray
получить ArrayBuffer
в .buffer
недвижимость для передачи ArrayBuffer
представление простого объекта Window
, delete
собственность в Worker
,
В window
this.data = {Cyclic:123,string:"imAString",int:10,Position:{a:1, b:2, c:3}};
const worker = new Worker("worker.js");
const encoder = new TextEncoder();
const decoder = new TextDecoder();
worker.onmessage = e => {
console.log(e.data)
}
console.log("original data in Window:", this.data);
this.encoded = encoder.encode(JSON.stringify(this.data));
worker.postMessage(this.encoded, [this.encoded.buffer]);
delete this.data;
delete this.encoded;
console.log("data deleted in Window:", this.data, this.encoded);
worker.onmessage = e => {
this.data = JSON.parse(decoder.decode(e.data));
console.log("data in message event at window:", this.data);
}
в Worker
const decoder = new TextDecoder();
const encoder = new TextEncoder();
self.onmessage = e => {
console.log(e.data);
self.data = JSON.parse(decoder.decode(e.data));
self.data.string = "imAStringToo";
self.encoded = encoder.encode(JSON.stringify(self.data));
console.log("data in Worker:", self.data);
self.postMessage(self.encoded, [self.encoded.buffer]);
delete self.data;
delete self.encoded;
console.log("data deleted in Worker:", self.data, self.encoded);
}