Ошибка веб-работника при использовании веб-сборки - PullRequest
0 голосов
/ 08 июня 2018

Я хотел бы использовать WebAssembly внутри веб-работника.

Из моего основного приложения я запускаю его так:

let w = new Worker('test.js');
w.onmessage = (event) => { console.log(event); };
w.onerror = (event) => { console.error(event); };
w.postMessage({ message: "Hello World" });

Затем я создал файл test.js какследует:

self.Module = {
    locateFile: function (s) {
        console.log(s);
        return s;
    }
};

self.importScripts("main.js"); 
// note: `main.js` is the JavaScript glue file created by emcc

self.onmessage = function(messageEvent) {
    console.log(messageEvent); // works!
    console.log(self.Module); // works!
    console.log(self.Module.ccall("test")); // crashes!
}

Я получаю сообщение об ошибке: Uncaught TypeError: Cannot read property 'apply' of undefined.Я не понимаю, почему self.Module не определено, как это возможно?

У меня такое ощущение, что в области работы веб-работника и WebAssembly есть что-то, что не очень хорошо работает вместе.

Спасибо за ваш вклад!

1 Ответ

0 голосов
/ 08 июня 2018

Проблема в том, что console.log () не показывает истинное состояние объекта во время выполнения.Дальнейшее копание показало, что на самом деле объект Module еще не был готов.

Я цитирую: https://kripken.github.io/emscripten-site/docs/getting_started/FAQ.html

Как определить, когда страница полностью заполненазагружен и безопасно вызывать скомпилированные функции?

Вызов скомпилированной функции до полной загрузки страницы может привести к ошибке, если функция использует файлы, которые могут отсутствовать

[...]

Другой вариант - определить функцию onRuntimeInitialized: Module['onRuntimeInitialized'] = function() { ... };

Этот метод будет вызван, когда среда выполнения будет готова, и вы можете вызывать скомпилированныйкод.

Настройка моего test.js (рабочего) файла устраняет проблему:

self.Module = {
    locateFile: function (s) {
        console.log(s);
        return s;
    }
    // Add this function
    onRuntimeInitialized: function() {
        test();
    }
};

self.importScripts("main.js"); 
// note: `main.js` is the JavaScript glue file created by emcc

self.data = {};

// to pass data from the main JS file
self.onmessage = function(messageEvent) {
    console.log(messageEvent); // works!
    self.data = messageEvent; // save the data
}

// gets executed when everything is ready.
self.test = function() {
    // we may safely use self.data and self.Module now!
    console.log(self.Module.ccall("test")); // works!
}
...