Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 29.10.2011, 14:34
Аватар для float
Профессор
Отправить личное сообщение для float Посмотреть профиль Найти все сообщения от float
 
Регистрация: 01.07.2010
Сообщений: 387

Цитата:
resolve-ит все объявленные стадии и глобальный обработчик?
нет не ресолвит. просто принудительно вызывает глобальные обработчики. это сразу планировался как внутренний метод. он вызывается когда все стадии выполнены.
и тут есть запарка, когда его вызывают из вне.
при таком вызове точно не ясно что делать с обработчиками success и err...
сейчас если диферд без стадий вызывается success(тк reject-а не было) и anyway

Последний раз редактировалось float, 29.10.2011 в 14:53.
Ответить с цитированием
  #12 (permalink)  
Старый 29.10.2011, 14:56
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

Сообщение от float
это сразу планировался как внутренний метод.
мне кажется и не стоит его выносить.
Ведь, тогда вы обманываете обработчики, говоря им, что событие уже выполнилось, но результатов события получить при этом нельзя
Ответить с цитированием
  #13 (permalink)  
Старый 29.10.2011, 15:18
Аватар для float
Профессор
Отправить личное сообщение для float Посмотреть профиль Найти все сообщения от float
 
Регистрация: 01.07.2010
Сообщений: 387

Цитата:
тогда вы обманываете обработчики
да. с этой позиции вы правы.
но есть другой момент.
у диферда вообще может не быть стадий. а success err anyway можно вешать.
логично иметь метод чтобы их вызвать...

Последний раз редактировалось float, 29.10.2011 в 15:22.
Ответить с цитированием
  #14 (permalink)  
Старый 29.10.2011, 17:33
Аватар для float
Профессор
Отправить личное сообщение для float Посмотреть профиль Найти все сообщения от float
 
Регистрация: 01.07.2010
Сообщений: 387

только я думаю надо чуть изменить.
finish зарыть.
а success err anyway можно сделать разное поведение в зависимости от аргументов.
функция - добавление в очередь. иначе вызов обработчиков в контексте с параметрами.
Ответить с цитированием
  #15 (permalink)  
Старый 30.10.2011, 03:52
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

float, а ты своим кодом просто продемонстрировал использование или подобный код действительно для чего-то используется? Если первое, можешь привести какой-нибудь рельный пример, когда нужен Deferred? Если второе, объяснить...
Ответить с цитированием
  #16 (permalink)  
Старый 30.10.2011, 16:42
Аватар для float
Профессор
Отправить личное сообщение для float Посмотреть профиль Найти все сообщения от float
 
Регистрация: 01.07.2010
Сообщений: 387

Просто перед тем как написать диферд, я прикинул что и как должно быть.
Когда видишь что должно получиться легче ориентироваться...

Цитата:
можешь привести какой-нибудь рельный пример
мне такой диферд пригодился для следующего:
в проекте админ панель на попапах(типо как в друпале).
содержимое попапов подгружается не сразу а при клике.
это всё обслуживает 1-н диферд.
там массив стадий с цепочой ajax>animation.
+по статусу стадии удобно смотреть где уже загружен контент а где нет.

а вообще есть 2-я причина такого диферда:
у меня в велосипеде риал-тайм анимация(без очередей как в jquery)
поэтому необходим инструмент согласовки...
Ответить с цитированием
  #17 (permalink)  
Старый 31.10.2011, 04:12
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

Сообщение от float
там массив стадий с цепочой ajax>animation.
не знаю, насколько я понял задачу, но почему не сделать как-то так?
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();
Ответить с цитированием
  #18 (permalink)  
Старый 31.10.2011, 05:03
Аватар для float
Профессор
Отправить личное сообщение для float Посмотреть профиль Найти все сообщения от float
 
Регистрация: 01.07.2010
Сообщений: 387

не могу понять из вашего кода что конкретно вы предлагаете поменять...
Цитата:
почему не сделать как-то так?
может и можно.
мой код выглядит примерно также, только без лишних телодвижений.
Ответить с цитированием
  #19 (permalink)  
Старый 31.10.2011, 06:43
Профессор
Отправить личное сообщение для with-love-from-siberia Посмотреть профиль Найти все сообщения от with-love-from-siberia
 
Регистрация: 14.12.2009
Сообщений: 155

Тема интересная. Что-то подобное уже обсуждалось в другой ветке на форуме. К сожалению все это по большей части "завязано" на браузерную среду либо "тянет" за собой целый ворох полезных, но не всегда нужных методов. Например, в среде 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.

Последний раз редактировалось with-love-from-siberia, 31.10.2011 в 07:02.
Ответить с цитированием
  #20 (permalink)  
Старый 31.10.2011, 07:35
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

Сообщение от float
не могу понять из вашего кода что конкретно вы предлагаете поменять...
deferred слишком сложный (слишком много возможностей), я не знаю, где его можно на полную использовать. Я предлагаю максимально упростить функциональность.

Сообщение от float
может и можно.
мой код выглядит примерно также, только без лишних телодвижений.
о каких лишних телодвижениях речь? Давай попробую переписать под твой фреймворк:
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();
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск