Показать сообщение отдельно
  #79 (permalink)  
Старый 27.12.2011, 19:07
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

Сообщение от FINoM
Обычный запуск цепочки:
chain.add(...).add(...).run()
Запуск по событию:
doc.addEventListener(event, chain.add(...).add(...).run);
В первом случае мы сами вызываем функцию, во втором, передаем функцию для запуска после отлова события.
зачем, если можно научить addEvent работе с цепочками? Передаем ей цепочку, а она сама вызывает run.

Сообщение от x-yuri
this обычно указывает на объект-источник события, в частности в данном случае.
Сообщение от FINoM
Не понял фразы.
что в js, что в mootools, this в обработчике указывает на объект, который сгенерировал событие. Моя реализация следует этому соглашению. И jquery тоже.

Сообщение от FINoM
Вместо
chain.setOptions({
onComplete: function(){blabla()}
}).add(function first(){}).add(function second(){})

писать
chain.add(function first(){}).add(function second(){}).add(function() blabla()})
да, удобнее приводить такие вот схематические примеры, которые скрывают недостатки. Должно было быть так:
chain.setOptions({
    onComplete: function() {
        // выполняем завершающие действия
    }
}).add(function() {
    this.fireEvent('complete');
}).add(function() {
    // делаем что-то еще
}).add(function() {
    // делаем что-то еще
});

chain
    .add(function() {
        runNext(true);
    })
    .add(function(ignore) {
        if ( ! ignore) {
            // делаем что-то еще
        }
        runNext(ignore);
    })
    .add(function(ignore) {
        if ( ! ignore) {
            // делаем что-то еще
        }
        runNext(ignore);
    })
    .add(function(ignore) {
        if (ignore) {
            // выполняем завершающие действия
        }
    });


Сообщение от FINoM
А где хранить состояние? В замкнутом объекте? В смысле, чтоб пользователь не имел к нему доступа напрямую.
если пользователь что-то делает напрямую, либо он знает, что делает, либо ССЗБ

Сообщение от FINoM
Блин, чем тебе пример не нравится. Или ты предлагаешь заменить функции на существующие? Какая разница, если суть от этого не изменится? Давай так: ты работал с нодой?
посмотри на пример выше и сравни со своим. У тебя не видно, что твой подход приводит к куче ненужного кода. С нодой работал, но не сильно. Собственно, и что? У нас тут в теме пользователь ноды, который вообще не видит проблемы. Приведи хотя бы какой-нибудь реальный пример, в котором видно, какие выполняются действия и какие передаются данные, а лучше самый сложный, если ты не хочешь ничего скрывать.

Сообщение от FINoM
То же самое. Задача описана для тех, кто знает, что такое серверный асинхронный JS.
задача не описана, описана проблема. По проблеме нельзя судить о том, достаточно функциональности у твоей функции или нет.

Сообщение от FINoM
Нет. Буду пользоваться тем, что есть. По крайней мере, в твоем примере, я не увидел того, что не решалось бы моим способом.
хорошо, давай посмотрим на то, что есть и на то, что будет:
$('userpic').addEvent('change',   // input type="file"
    function() {
        chain
            .add(function(runNext) {
                $('attach-file').addClass('disabled');
                $('attach-file-throbber')
                    .removeClass('invisible');

                sendForm({
                    form: 'change-userpic-form',
                    url: '/upload/userpic',
                    onSuccess: function(userpicURL) {
                        runNext(false, userpicURL);
                    },
                    onFailure: function() {
                        runNext(true);
                    }
                });
            })
            .add(function(runNext, failure, userpicURL) {
                if (failure) {
                    runNext(true);
                }
                var cropResizeUserpicDialog = new CropResizeUserpicDialog({
                    userpicURL: userpicURL,
                    dstWidth: 100,
                    dstHeight: 100,
                    onOk: function(cropX, cropY, cropWidth, cropHeight, resizeWidth, resizeHeight) {
                        runNext(false, false, userpicURL, cropResizeUserpicDialog, cropX, cropY, cropWidth, cropHeight, resizeWidth, resizeHeight);
                    },
                    onCancel: function() {
                        runNext(true);
                    }
                }));
            })
            .add(function(runNext, ignore, failure, userpicURL, cropResizeUserpicDialog, cropX, cropY, cropWidth, cropHeight, resizeWidth, resizeHeight) {
                if (ignore) {
                    runNext(true);
                }
                if (failure) {
                    runNext(false, true);
                }
                var cropResize = new CropResize();
                cropResize.load(userpicURL, {
                    onSuccess: function() {
                        runNext(false, false, userpicURL, cropResizeUserpicDialog, cropX, cropY, cropWidth, cropHeight, resizeWidth, resizeHeight, cropResize);
                    },
                    onFailure: function() {
                        runNext(false, true);
                    }
                });
            })
            .add(function(runNext, ignore, failure, userpicURL, cropResizeUserpicDialog, cropX, cropY, cropWidth, cropHeight, resizeWidth, resizeHeight, cropResize) {
                if (ignore) {
                    runNext(true);
                }
                if (failure) {
                    runNext(false, true);
                }
                cropResize
                    .crop(cropX, cropY, cropWidth, cropHeight)
                    .resize(resizeWidth, resizeHeight)
                    .save({
                        url: '/upload/thumb',
                        onSuccess: function() {
                            runNext(false, false, userpicURL, cropResizeUserpicDialog);
                        },
                        onFailure: function() {
                            runNext(true);
                        }
                    });
            })
            .add(function(failure, userpicURL, cropResizeUserpicDialog) {
                if (failure) {
                    // показать пользователю сообщение об ошибке
                } else {
                    if ($('userpic-url')) {
                        var usrpicUrl = $('userpic-url');
                    } else {
                        var usrpicUrl = new Element({
                            id: 'userpic-url',
                            type: 'hidden'
                        });
                        usrpicUrl.inject('change-userpic-form');
                    }
                    usrpicUrl.name = 'userpic-url';
                    usrpicUrl.value = userpicURL;

                    $('eUserpicThumb').src = userpicURL;
                }

                $('attach-file').removeClass('disabled');
                $('attach-file-throbber')
                    .addClass('invisible');
                cropResizeUserpicDialog
                    && cropResizeUserpicDialog.close();
            });
    }
);


p.s. ты либо специально скрываешь недостатки, либо... не специально. И даже если мое решение требуется в исключительных случаях... чем твое решение лучше существующих для ноды?

Последний раз редактировалось x-yuri, 27.12.2011 в 19:38.
Ответить с цитированием