Цитата:
и тут есть запарка, когда его вызывают из вне. при таком вызове точно не ясно что делать с обработчиками success и err... сейчас если диферд без стадий вызывается success(тк reject-а не было) и anyway |
Цитата:
Ведь, тогда вы обманываете обработчики, говоря им, что событие уже выполнилось, но результатов события получить при этом нельзя |
Цитата:
но есть другой момент. у диферда вообще может не быть стадий. а success err anyway можно вешать. логично иметь метод чтобы их вызвать... |
только я думаю надо чуть изменить.
finish зарыть. а success err anyway можно сделать разное поведение в зависимости от аргументов. функция - добавление в очередь. иначе вызов обработчиков в контексте с параметрами. |
float, а ты своим кодом просто продемонстрировал использование или подобный код действительно для чего-то используется? Если первое, можешь привести какой-нибудь рельный пример, когда нужен Deferred? Если второе, объяснить...
|
Просто перед тем как написать диферд, я прикинул что и как должно быть.
Когда видишь что должно получиться легче ориентироваться... Цитата:
в проекте админ панель на попапах(типо как в друпале). содержимое попапов подгружается не сразу а при клике. это всё обслуживает 1-н диферд. там массив стадий с цепочой ajax>animation. +по статусу стадии удобно смотреть где уже загружен контент а где нет. а вообще есть 2-я причина такого диферда: у меня в велосипеде риал-тайм анимация(без очередей как в jquery) поэтому необходим инструмент согласовки... |
Цитата:
new AsyncChain({
onFailure: function() {
...
}
})
.add(function(NEXT) {
new Request({url: ...,
onSuccess: function() {
NEXT();
},
onFailure: function() {
this.fireEvent('failure')
}.bind(this)
}).post();
})
.add(function(NEXT) {
$(...).get('tween').setOptions({
onComplete: function() {
NEXT();
}
}).start('left', 100);
})
...
.run();
|
не могу понять из вашего кода что конкретно вы предлагаете поменять...
Цитата:
мой код выглядит примерно также, только без лишних телодвижений. |
Тема интересная. Что-то подобное уже обсуждалось в другой ветке на форуме. К сожалению все это по большей части "завязано" на браузерную среду либо "тянет" за собой целый ворох полезных, но не всегда нужных методов. Например, в среде WSH нет методов window.setTimeout/setInterval (да и объекта такого нет, хотя его просто получить, например new ActiveXObject('htmlfile').parentWindow). Тем не менее в WSH встречаются задачи, которые требуют синхронизации данных между основным потоком исполнения и потоком, выполняющимся асинхронно. Конкретный пример - временные потребители, следящие за изменением состояния служб Windows:
var wmi = GetObject('winmgmts:\\\\.\\Root\\CIMV2');
var query = 'SELECT * FROM __InstanceModificationEvent WITHIN 5 WHERE TargetInstance ISA "Win32_Service"';
var sink = WScript.CreateObject('WbemScripting.SWbemSink', 'Sink_');
wmi.ExecNotificationQueryAsync(sink, query);
function Sink_OnObjectReady(e)
{
if ( e.TargetInstance.State != e.PreviousInstance.State ) {
WScript.Echo('****');
WScript.Echo(new Date());
WScript.Echo(e.TargetInstance.DisplayName);
WScript.Echo('Current state: ' + e.TargetInstance.State);
WScript.Echo('Previous state: ' + e.PreviousInstance.State);
}
};
WScript.Echo('**** Waiting for asynchronous event...');
while ( 1 ) {
WScript.Sleep(1000);
}
Предлагаемые Deferred и Promise решения выглядят красивыми, но громоздкими. Гораздо проще были бы решения вроде предложенной x-yuri. |
Цитата:
Цитата:
new AsyncChain({
onFailure: function() {
...
}
})
.add(function(NEXT) {
_.post('some/url.php').success(function(data) {
NEXT();
}).err( this.fireEvent('failure') );
})
.add(function(NEXT) {
_('.menu').hide(200, function() {
if (this.length) {
NEXT();
} else { this.fireEvent('failure'); }
}.bind(this));
})
...
.run();
|
| Часовой пояс GMT +3, время: 13:20. |