Страницы

Поиск по вопросам

четверг, 4 октября 2018 г.

Worker-ы убивают IE11

Выполнение этого небольшого теста
window.URL = window.URL || window.webkitURL; var response = "self.onmessage=function(e){ if (console && console.time) console.time('worker '+e.data); var l = 20000, p = 1; for( var i = 1; i <= l; i++ ) for( var j = 1; j <= l; j++ ) p += Math.log( j / i ); if (console && console.timeEnd) console.timeEnd('worker '+e.data); postMessage( 'Worker '+e.data+': Отработал и ушел в отпуск!' ); self.close(); }";
var blob; try { blob = new Blob( [response], {type: 'application/javascript'} ); } catch (e) { window.BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder; blob = new BlobBuilder(); blob.append(response); blob = blob.getBlob(); } var worker = new Worker( URL.createObjectURL(blob) );
worker.onmessage = function(e) { if (console) console.log( e.data ); // worker.terminate(); }; worker.postMessage( 'А' );
Приводит к выдаче сообщения в IE11: Ошибка выдается при обоих вариантах завершения работников
self.close(); worker.terminate();
Без этих строк все отлично работает, кроме того что по мере вызова работников увеличивается число созданных объектов...
Как в IE прервать выполнение работника (worker) до завершения его программы без падения браузера ?


Ответ

Из-за проблемы безопасности(англ.) - создание worker-ов в IE10-11 посредством Blob-конструктора не представляется возможным. Вам остаётся использовать URL и внешний скрипт или data-URI. Вот например

var worker = new Worker('data:application/javascript,' + encodeURIComponent(response) );
обновление
К сожалению IE10+ не поддерживает и вариант с data-URI
На stackowerflow.com (англ.)

Комментариев нет:

Отправить комментарий