#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'»)