Javascript-форум (https://javascript.ru/forum/)
-   Ваши сайты и скрипты (https://javascript.ru/forum/project/)
-   -   FTread, исполнение функций в отдельных потоках (https://javascript.ru/forum/project/7558-ftread-ispolnenie-funkcijj-v-otdelnykh-potokakh.html)

PeaceCoder 08.02.2010 15:05

Цитата:

Сообщение от tenshi
я бы его просто не использовал х)

Это умное решение. когда встал вопрос какая из ФВ лучшая, то прототайп у меня улетел сразу как я в него глянул.

tenshi 08.02.2010 16:36

а кто прилетел вместо него?

PeaceCoder 08.02.2010 21:10

Цитата:

Сообщение от tenshi
а кто прилетел вместо него?

jQ. Еще посматриваю на mootools.

tenshi 08.02.2010 23:23

хрен редьки не слаще..

Gvozd 08.02.2010 23:41

tenshi,
может попробуешь довести свой скрипт под осла?
у меня не выходит:
1)на root onpropertychange не срабатывает. зато срабатывает на document-е
2)даже если он срабатывает, то оба срабатывания происходят после вывода alert([ inverse( 0 ), inverse( 1 ) ])
то есть я не знаю, как получить res в такой ситуации

tenshi 08.02.2010 23:50

у меня в осле работало.. правда проверял я в 8..
а вот в лисице - жопа >_<" ща попробую по другому переделать..

Gvozd 08.02.2010 23:56

Хитрый план такой хитрый)))
не гарантирую, что это будет работать в 100% случаев/
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
		var image=document.createElement('img');
		image.onerror=function()
			{
			res= thread.proc.apply( self, args )
			}
		image.src='';//or 'about:blank'
		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
})
alert([ inverse( 0 ), inverse( 1 ) ])
// prints [ undefined, 1 ] and exception 'division by zero' in console log 

}

исключение бросается уже как в опере, так и в осле.
DebugBar даже начал отладку
а вот в лисе, исключения не пробрасываются

tenshi 09.02.2010 14:13

var FThread= new function(){

Version: 4
Descr: 'creates a wrapper for function that allows you to not be afraid of exceptions in'
License: 'public domain'
 
Implementation:

var scripts= document.getElementsByTagName( 'script' )
var script= scripts[ scripts.length - 1 ]
var starter= document.createElement( 'button' )
starter.id= 'thread starter'
starter.style.display= 'none'
script.parentNode.insertBefore( starter, script )

var FThread= function( proc ){
    var thread= function( ){
		var res, self= this, args= arguments
		starter.onclick= function( ev ){
		    ( ev || event ).cancelBubble= true
		    starter.onclick= null
		    res= thread.proc.apply( self, args )
		}
        starter.click()
        return res
    }
    thread.proc= proc
    return thread
}
 
Export: return FThread

Usage:

var inverse= FThread(function( a ){
    if( a === -1 ) throw (void 0)()
    if( a === 0 ) throw new Error( 'custom error' )
    return 1/a
})
alert([ inverse( -1 ), inverse( 0 ), inverse( 1 ) ])
// alerts ",,1" and two exceptions in console log

}

исключения всплывают везде, только вот кастомные исключения теряют бэктрейс в мозилле и вообще всё в опере

tenshi 09.02.2010 14:58

с оперой разобрался - нужно было обновить и включить: opera:config#UserPrefs|Exceptions Have Stacktrace

Gvozd 09.02.2010 18:11

Цитата:

Сообщение от tenshi
исключения всплывают везде

в мозилле твоя третья версия скрипта из первого сообщения в теме не пробрасывала ничего
вторая до правки также
теперь в мозилле пробрасывает.

теперь вообще везде работает.
красота
про click хорошо придумал. для него есть гарантия, что если на протестированном браузере сработал именно так, то так будет всегда, а не зависеть от погоды, как в случае image.onerror у меня


Часовой пояс GMT +3, время: 18:56.