Краткий ответ
Бросьте исключение внутри фильтра и поймайте его снаружи. Возможно, вам придется собирать включенные элементы в массив самостоятельно, поскольку у вас не будет доступа к возвращаемому значению find
.
Длинный ответ
Вы слишком сосредоточены на конкретной тактике (остановка find
при использовании фильтра), когда вам может быть полезно отступить назад и подумать, чего вы пытаетесь достичь.
Честно говоря, звучит так, будто вы пытаетесь съесть свой торт и иметь его тоже: вы хотите быть гибкими и указывать условия поиска в функции, которую вы легко можете изменить, но вы также хотите быть эффективными и не извлекать больше данных базы данных, чем нужно.
Дело в том, что передача функции фильтра в find
уже настолько неэффективна, насколько вы можете ее получить, потому что li3 придется извлечь каждую запись из базы данных , прежде чем ваш фильтр даже будет вызван. Вот где неэффективность. Остановка процесса фильтрации, когда вы нажмете 10 предметов или что-то еще, не будет иметь большого значения (если ваша фильтрация также не очень дорогая).
Я бы порекомендовал подумать о следующем:
Вам действительно нужно разрешить какой-либо метод фильтрации вообще? Можно ли использовать декларативные условия? Если это так, вы можете указать опции limit
и позволить базе данных выполнять всю работу.
Если вы не можете, рассмотрите возможность использования find
для получения небольшого пакета записей и сбора тех, которые вы хотите сохранить в массиве. Повторите с другой небольшой партией, пока вы не проверите каждый элемент в базе данных или не заполните свой массив.