завершение / последовательная обработка методов

#javascript #deferred-execution

#javascript #отложенное выполнение

Вопрос:

Предполагая, что у меня есть объект, подобный массиву, который позволяет связывать методы, подобные so:

 var ds = new DataSet(items);
var subset = ds.filter(condition1).filter(condition2);
  

Есть ли способ выполнить код после обработки последнего метода в цепочке — не прибегая к ручному добавлению отдельного .finalize() (или end / execute /…) вызова метода?

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

Ответ №1:

Если вы управляете filter методом, может быть, есть идея добавить параметр finalize?

 .filter(condition,[some finalizer function]);
  

в filter :

 if (finalizer){
   finalizer();
}
  

[редактировать на основе комментария]

Другим подходом могло бы быть включение условия финализатора, таким образом, в .filter(condition) содержимое condition определяет необходимость завершения.

Что-то вроде (я не знаю типа вашего состояния, просто выдумываю):

 if (condition.match('f=true')) {
  finalizer();
}
  

Комментарии:

1. Ну, да, но это не сильно отличается от добавления вызова метода — мне любопытно, возможно ли вообще избежать этого шага вручную.

2. Я ценю ваш вклад — однако перемещение флага / триггера завершения в условие, похоже, ничем не отличается от добавления завершающего вызова метода. (условиями могут быть обычные вещи, такие как «> 3» или «начинается с ‘foo'»)