Аналогичен шаблону обещаний / отсрочек, которые поддерживают несколько результатов и отмены - PullRequest
4 голосов
/ 29 сентября 2011

Аналогично шаблону обещаний Я ищу шаблон событий, который не требует загрязнения объектов методами addEventListener / etc, я хочу иметь возможность вернуть объект, который также можно отменитькак «разрешенные» несколько раз.

Например, я могу написать метод, который возвращает объект «интервал», что-то вроде этого:

var ticker = createTicker(1000);
var subscription = ticker.then(function() { console.log('tick') });
... later on ...
subscription.cancel();

Ключевые различия здесь аналогичныВ обещании события стандартизированы, поэтому я могу подписаться без необходимости знать имя события, однако, в отличие от обещания, «завершение» может происходить несколько раз и даже может быть отменено (это будет эквивалентно removeEventListener).

Мне интересно узнать, допустимо ли это для обещаний, чтобы обработчик прогресса можно было использовать для множественных обратных вызовов, а полный обработчик никогда не использовался, но, что более важно, существует концепция отказа от подписки на обещание..

Если это не так, и обещания специализированы для этого сценария, яЕсть ли стандартизированный шаблон для того, что я описал?

1 Ответ

2 голосов
/ 29 сентября 2011

Возможность отмены может быть добавлена ​​к реализации обещания, не нарушая основную парадигму наличия однократных обратных вызовов успеха / неудачи.

Фактически, jQuery уже имеет отмену для экземпляров обещания, которые он возвращаетиз jQuery.ajax звонков:

Для обратной совместимости с XMLHttpRequest объект jqXHR предоставляет следующие свойства и методы:

  • readyState
  • status
  • statusText
  • responseXML и / или responseText, когда базовый запрос ответил xml и / или текстом, соответственно
  • setRequestHeader (name, value), который отправляетсяиз стандарта, заменяя старое значение новым, а не конкатенируя новое значение к старому
  • getAllResponseHeaders ()
  • getResponseHeader ()
  • abort()

Вы можете написать обертку setTimeout, которая предоставляет интерфейс обещаний вместе с дополнительной отменойthod.

Однако, как только вы попадаете на территорию с множеством огней, я думаю, что это не то, для чего предназначены обещания.Вам нужно будет определить множество правил и исключений в отношении того, как многократная стрельба будет действовать наряду с функциональностью обычных обещаний.Для меня не имеет большого смысла использовать обещания таким образом.


Обновление (на основе обсуждения в комментариях):

Вот примерреализация обещания «прокси», которое позволяет прервать дальнейшую ретрансляцию вызовов «сделано / не выполнено»:

http://jsfiddle.net/atesgoral/qvtqu/

...