Сообщение от 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. ты либо специально скрываешь недостатки, либо... не специально. И даже если мое решение требуется в исключительных случаях... чем твое решение лучше существующих для ноды?