|
FThread, исполнение функций в отдельных потоках
Фабрика, создающая обёртку, которая запускает функцию в отдельном потоке в результате чего её падение не приводит к падению запустившего её кода. потоки не параллельны!
var FThread= new function(){ Version: 3 Descr: 'creates a wrapper for function that allows you to not be afraid of exceptions in' License: 'public domain' Implementation: var root= document.documentElement var FThread= function( proc ){ var thread= root.addEventListener ? function( ){ var res, self= this, args= arguments root.addEventListener( 'launch thread', function( ){ root.removeEventListener( 'launch thread', arguments.callee, false ) res= thread.proc.apply( self, args ) }, false ) var event= document.createEvent( 'UIEvents' ) event.initEvent( 'launch thread', false, false ) root.dispatchEvent( event ) return res } : function( ){ var res, self= this, args= arguments root.attachEvent( 'onpropertychange', function( ){ root.detachEvent( 'onpropertychange', arguments.callee ) delete root[ 'launch thread' ] res= thread.proc.apply( self, args ) } ) root[ 'launch thread' ]= null return res } thread.proc= proc return thread } Export: return FThread Usage: var inverse= FThread(function( a ){ if( a === 0 ) throw 'division by zero' return 1/a }) console.log([ inverse( 0 ), inverse( 1 ) ]) // prints [ undefined, 1 ] and exception 'division by zero' in console log }код не актуален ввиду новой версии: http://javascript.ru/forum/project/7...html#post44189 |
Интересно, правда не очень представляю прикладного применения.
Зато я узнал, что можно вот так вот сделать: function A(flag) { this.a = 1; if(flag == 1) return {c: 3}; // typeof == "object" if(flag == 2) return 4; // typeof != "object" } A.prototype.b = 2; console.log(new A()); // {a:1, b: 2} console.log(new A(1)); // {c: 3} console.log(new A(2)); // {a:1, b: 2} |
применение - независимая инициализация модулей, независимое исполнение обработчиков событий и тп
|
Цитата:
почерпнул для себя кое-что новое вот только, исключение нигде не выползает в консоль(Opera, Mozilla) Разве что, не вижу смысла зачем городить потоки для данной задачи. Сделал вот такое решение. Кто-то видит подводные камни какие? var GThread= new function(){ //Version: 3 //Descr: 'creates a wrapper for function that allows you to not be afraid of exceptions in' //License: 'public domain' //Implementation: var GThread=function(proc){ var thread=function() { try { return proc.apply(this,arguments); } catch(e) { console.warn(e); console.trace(); return undefined; } } return thread; } //Export: return GThread //Usage: var inverse=GThread(function(a){ if(a===0) throw 'division by zero'; return 1/a; }) var inverse2=GThread(function(a){ return -a; }) console.log([inverse(0),inverse2(2),inverse(2)]) // prints [undefined, -2, 0.5] without( :( ) exception 'division by zero' in console log } |
Цитата:
|
> Сделал вот такое решение. Кто-то видит подводные камни какие?
жопа с отладкой затрайкатченного кода |
Цитата:
Opera 10.10 с активной консолью ошибок - молчок Firefox 3.5.7 с firebug-ом - молчок IE 8.0.6001 - молчок Более того результаты alert-a: Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
у тебя также ни единого исключения не было проброшено кстати, ничто не мешает бросить console.error(e); поправил свой код по этому поводу |
А кто мешает сделать так ?
catch(e) { if (console) console.error(e); return undefined; } |
PeaceCoder,
пока писал и правил свое сообщение, вы уже написали один из моих моментов))) |
гм.. что-то не то.. ща поковыряюсь..
|
Часовой пояс GMT +3, время: 01:17. |
|