Цитата:
и тут есть запарка, когда его вызывают из вне. при таком вызове точно не ясно что делать с обработчиками 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, время: 07:03. |