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

tenshi 09.02.2010 18:18

примечательно, что cancelBubble работает во всех браузерах

artyv 23.03.2010 12:46

Сделал DOM-независимое решение:

/**
 * Javascript ThreadBox
 *
 * DOM-independent implementation of FThread {@link http://habrahabr.ru/blogs/javascript/86852/}
 *
 * Usage: threadBox([context,] function);
 *
 * @author Vasiliy Aksyonov <outring@gmail.com>
 * @version 1.0
 */

var threadBox = (function() {

    var thread;

    try { thread = new ActiveXObject("Msxml2.XMLHTTP"); }

    catch (e) {

        try { thread = new ActiveXObject("Microsoft.XMLHTTP"); }

        catch (e) { thread = false; }
    }

    if (!thread && typeof XMLHttpRequest != 'undefined') {

        thread = new XMLHttpRequest();
    }

    if(thread) {

        var threadBox = function () {

            var context = arguments.length >= 2 ? arguments[0] : null;
            var process = arguments.length >= 2 ? arguments[1] : arguments[0];

            thread.onreadystatechange = function() {

                if (!process) {

                    return;
                }

                var innerProcess = process;

                process = null;

                innerProcess.call(context);
            };

            thread.open('GET', '#', true);
            thread.send(null);
        }
    }

    else {

        var threadBox = function () {

            var context = arguments.length >= 2 ? arguments[0] : null;
            var process = arguments.length >= 2 ? arguments[1] : arguments[0];

            try { process.call(context); }
            catch(e) { setTimeout(function() { throw e; }, 0); }
        }
    }

    return threadBox;
})();


Несмотря на то, что делаем асинхронный XMP запрос, работает вроде синхронно. Способ использования отличается конечно, но ничто не мешает переделать, но на мой взгляд (мне) так удобнее : D
Ну и да, как видно добавлен небольшой костыль внизу, на всякий случай, в хроме он конечно не сильно поможет : D но хоть что-то

tenshi 23.03.2010 12:56

ага, я попробовал с синхронным и обламался х)

tenshi 23.03.2010 13:13

решётку запрашивать - не вариант. ибо если не прокэшируется, то это жопа.
ещё у тебя несколько раз должна вызываться функция при каждом изменении состояния. поэтому надо удалять обработчик при первом использовании, как у меня.

artyv 23.03.2010 13:19

1 надо проверить, мне кажется что он пытается выполнить стандартный запрос якоря на текущей странице, как при клике на ссылку, так что тут даже вероятно и запроса то к серверу не идёт
2 выполнять 2 раза не будет, т.к. после выполнения я обnullяю process : D хотя проще было убить хэндлер, это да, затупил

Как проверить проще всего? Не хочется ставить мониторов соединений никаких

artyv 23.03.2010 13:32

Проверил синхронность. FAIL

tenshi 23.03.2010 13:38

м.. не, реквесты не катят - ошибки глотаются =(

tenshi 23.03.2010 13:39

var FThread= new function(){

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

var FThread= function( proc ){
    var thread= function( ){
        var res, self= this, args= arguments
        var starter= new XMLHttpRequest
        starter.onreadystatechange= starter.onabort= function( ev ){
        	starter.onreadystatechange= starter.onabort= null
		    res= thread.proc.apply( self, args )
		}
        //console.dir( starter )
        starter.open( 'get', '#', true )
        starter.send( null )
        starter.abort()
        return res
    }
    thread.proc= proc
    return thread
}
 
//Export: return FThread

Usage:

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

}

artyv 23.03.2010 13:41

У меня такое наблюдается только в FF3.6, в более старых версиях ок, возможно дело в плагинах.
А с синхронностью обстоит так: в FF при синхронном запросе onreadystatechange не выполняется, а во всех остальных браузерах выполняется, но в IE всегда почему-то только один раз

artyv 23.03.2010 15:04

В общем всё решилось, кроме того, что FF>=3.5 проглатывает ошибки зачем то : (
Вот как поменялась функция:
var threadBox = function () {

    var context = arguments.length >= 2 ? arguments[0] : null;
    var process = arguments.length >= 2 ? arguments[1] : arguments[0];

    thread.open('GET', '#', Array.toSource ? true : false);

    thread.onreadystatechange = function () {

        thread.onreadystatechange = function () { };

        process.call(context);
    };

    thread.send(null);
}


Пока что ищу решение, как заставить ФФ не глотать : D


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