javascript - SharedArrayBuffer 中的数组始终用零填充

标签 javascript arrays google-chrome buffer

基本上,无论我做什么,从缓冲区创建的任何数组(不必共享)都会产生一个与缓冲区元素长度相同的数组,但它的所有值都为零。请注意,我需要在 chrome 中执行此操作,而关于类型化数组的 Mozilla 文档似乎不适用于 chrome。

我想要一个表示其中已有数据的缓冲区的数组。我的用例是一个网络工作人员接收一个共享数组缓冲区,其中已经有数据。但是,我没有成功创建代表该缓冲区的 View 。

function testIntBuffer(n) {
    return new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT * n);
}

function fillIntBuffer(buffer, endInt) {
    for (var i = 0; i <= endInt; i++) {
        buffer[i] = i;
    }
    return buffer;
}

var a = testIntBuffer(10);
fillIntBuffer(a, 10);
console.log(a);

var b = new Int32Array(a);
console.log(b)

这就是我的项目中真实代码的样子(除了假数据函数):

//inside main.js
function fakeDataArray(n) {
    const arr = [];
    for(let i = 0; i <= n; i++) {
        arr[i] = Math.floor(Math.random() * 100);
    }
    return arr;
}

function normalArrayToSBA(rawData) {
    const n = rawData.length;
    const m = Int32Array.BYTES_PER_ELEMENT;
    const data = new SharedArrayBuffer(m * n);
    rawData.forEach((datum, i) => {
        data[i] = datum;
    });
    return [data, n, m];
}

function createWorker() {
        const w = new Worker('workerBundle.js');
        w.onmessage = (event) => {
            const command = event.data.command;
            if (command === 'workerFinish') {
                console.log('event recieved from worker: ', event);
            }
            if (!command) {
                return;
            }
        };
        return w;
    }

function startworker(dataInfo, options) {
    const worker = createWorker();
    function setWorkerData(dataInfo) {
        const priceBuffer = dataInfo[0];
        const size = dataInfo[1];
        const offset = dataInfo[2];
        worker.postMessage({
            command: 'setData',
            priceBuffer: priceBuffer,
            size: size,
            offset: offset
        });
    }
    function getWorkerStats(_options) {
        worker.postMessage({
            command: 'getStats',
            options: _options,
        });
    }
    const id = Math.random();
    setWorkerData(dataInfo);
    getWorkerStats(options);
}

let data = fakeDataArray(5751);
let dataInfo = normalArrayToSBA(data);
startworker(dataInfo);

//inside workerBundle.js

//eslint-disable-next-line no-unused-vars
const WorkerMessageInterface = {
    file: null,
    priceData: null,
    role: 'worker',
    id: null,
    pendingRequests: {},
    setRole(event) {
        WorkerMessageInterface.role = event.data.role;
        WorkerMessageInterface.id = event.data.id;
        self.postMessage({
            success: true,
            commandGiven: event.data.command
        });
    },
    //command: 'setFile'
    /*{ command: 'setFile', fileInfo: String }*/
    setFile(event) {
        WorkerMessageInterface.file = event.data.file;
        self.postMessage({
            success: true,
            commandGiven: event.data.command
        });
    },
    //command: 'setData'
    /**
     * @param {priceData} Array
     * @param {source} String - Indicates what utility mapping  is necesarry
     *                          to convert data into the highcharts format
    */
    setData(event) {
        const data = event.data;
        const priceBuffer = new Int32Array(data.priceBuffer);
        WorkerMessageInterface.priceData = [priceBuffer, data.size];
    },
    //command: 'getSignals'
    /**
     * @param {options} Object
    */
    getAverage(dataArray) {
        let sum = 0;
        let length = dataArray.length;
        dataArray.forEach((n) => {
            sum += n;
        });
        return sum / length;
    },
    getStats(event) {
        const ops = event.data.options;
        const id = WorkerMessageInterface.id;
        const data = WorkerMessageInterface.priceData;
        const stats = WorkerMessageInterface.getAverage(data);
        if (WorkerMessageInterface.role === 'worker') {
            self.postMessage({
                results: stats,
                command: 'workerFinish',
                id: id
            });
        }
    },
    listenForCommands() {
        self.onmessage = (event) => {
            const command = event.data.command;
            WorkerMessageInterface[command](event);
            self.postMessage({
                worker: true,
                commandGiven: command,
                status: 'recieved',
            });
        };
    }
};
WorkerMessageInterface.listenForCommands();

最佳答案

在调用 fillIntBuffer() 之前将 SharedArrayBuffer 传递给 new Int32Array()

function testIntBuffer(n) {
  return new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT * n);
}

function fillIntBuffer(buffer, endInt) {
  for (var i = 0; i <= endInt; i++) {
    buffer[i] = i;
  }
  return buffer;
}

var a = testIntBuffer(10);
var b = new Int32Array(a);
fillIntBuffer(b, 10);
console.log(b);

关于javascript - SharedArrayBuffer 中的数组始终用零填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46557283/

相关文章:

c - 从字符串中获取最后一个单词

C++ 静态数组

javascript - 从谷歌浏览器扩展调用页面功能

javascript - 禁用 Chrome 剪贴板弹出窗口 WebdriverIO

javascript 代码执行和 ajax 异步

javascript - JSON 对象中的数字类型

javascript - 如何获取图像数组中的特定按钮 ID

JavaScript - 无法读取未定义的属性 'toLowerCase'

javascript - 谷歌浏览器控制台,打印图像

javascript - 阻止 Firefox 重新加载确认