Выполнение этого небольшого теста
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 (англ.)
Комментариев нет:
Отправить комментарий