Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 08.02.2010, 00:41
Профессор
Отправить личное сообщение для tenshi Посмотреть профиль Найти все сообщения от tenshi
 
Регистрация: 20.03.2008
Сообщений: 1,183

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 

}
код не актуален ввиду новой версии: FTread, исполнение функций в отдельных потоках

Последний раз редактировалось tenshi, 09.02.2010 в 16:29.
Ответить с цитированием
  #2 (permalink)  
Старый 08.02.2010, 01:52
Аватар для Мараторий
Кандидат Javascript-наук
Отправить личное сообщение для Мараторий Посмотреть профиль Найти все сообщения от Мараторий
 
Регистрация: 22.01.2010
Сообщений: 114

Интересно, правда не очень представляю прикладного применения.

Зато я узнал, что можно вот так вот сделать:
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}
Ответить с цитированием
  #3 (permalink)  
Старый 08.02.2010, 02:04
Профессор
Отправить личное сообщение для tenshi Посмотреть профиль Найти все сообщения от tenshi
 
Регистрация: 20.03.2008
Сообщений: 1,183

применение - независимая инициализация модулей, независимое исполнение обработчиков событий и тп
__________________
.ня
Ответить с цитированием
  #4 (permalink)  
Старый 08.02.2010, 02:27
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

Сообщение от tenshi
потоки не параллельны!
заметка: и даже не ассинхронны
почерпнул для себя кое-что новое
вот только, исключение нигде не выползает в консоль(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 

}

Последний раз редактировалось Gvozd, 08.02.2010 в 03:53.
Ответить с цитированием
  #5 (permalink)  
Старый 08.02.2010, 02:32
Профессор
Отправить личное сообщение для tenshi Посмотреть профиль Найти все сообщения от tenshi
 
Регистрация: 20.03.2008
Сообщений: 1,183

Цитата:
вот только, исключение нигде не выползает в консоль(Opera, Mozilla)
не может этого быть. специально чтобы исключения обрабатывались браузером и делалось.
__________________
.ня
Ответить с цитированием
  #6 (permalink)  
Старый 08.02.2010, 02:36
Профессор
Отправить личное сообщение для tenshi Посмотреть профиль Найти все сообщения от tenshi
 
Регистрация: 20.03.2008
Сообщений: 1,183

> Сделал вот такое решение. Кто-то видит подводные камни какие?
жопа с отладкой затрайкатченного кода
__________________
.ня
Ответить с цитированием
  #7 (permalink)  
Старый 08.02.2010, 02:51
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

Сообщение от tenshi
не может этого быть. специально чтобы исключения обрабатывались браузером и делалось.
разве?
Opera 10.10 с активной консолью ошибок - молчок
Firefox 3.5.7 с firebug-ом - молчок
IE 8.0.6001 - молчок
Более того результаты alert-a:
Сообщение от Opera
<localhost>

,
Сообщение от IE
---------------------------
Сообщение с веб-страницы
---------------------------
,
---------------------------
ОК
---------------------------
и только огнелис радует:
Цитата:
,1
мой скрипт везде выводит одинаково
Цитата:
,-2,0.5
Сообщение от tenshi
жопа с отладкой затрайкатченного кода
в смысле что исключения нигде не видны?
у тебя также ни единого исключения не было проброшено
кстати, ничто не мешает бросить console.error(e);
поправил свой код по этому поводу

Последний раз редактировалось Gvozd, 08.02.2010 в 02:56.
Ответить с цитированием
  #8 (permalink)  
Старый 08.02.2010, 02:54
Аватар для PeaceCoder
Профессор
Отправить личное сообщение для PeaceCoder Посмотреть профиль Найти все сообщения от PeaceCoder
 
Регистрация: 15.12.2009
Сообщений: 742

А кто мешает сделать так ?
catch(e)
  {
  if (console) console.error(e);
  return undefined;
  }
__________________
Настоящий программист думает и осознает сам решение задачи, а не копирует другие мысли, не осознавая их (c)
Относись к человеку так же, как хотелось бы отношения к себе (с)
Все нужно там, где оно нужно, а все не нужно нигде (с) Gozar
B~Vladi: А кто такой JavaScript стрелок?! micscr: это тот, кто не jQuery танкист.
Программы становятся медленнее быстрее, чем компьютеры становятся быстрее (с) Никлаус Вирт
Ответить с цитированием
  #9 (permalink)  
Старый 08.02.2010, 02:57
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

PeaceCoder,
пока писал и правил свое сообщение, вы уже написали один из моих моментов)))
Ответить с цитированием
  #10 (permalink)  
Старый 08.02.2010, 03:09
Профессор
Отправить личное сообщение для tenshi Посмотреть профиль Найти все сообщения от tenshi
 
Регистрация: 20.03.2008
Сообщений: 1,183

гм.. что-то не то.. ща поковыряюсь..
__________________
.ня
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск