Фокус в том, чтобы сначала убедиться, что ни один из фьючерсов не сработал. .recover
- ваш друг здесь, вы можете объединить его с map
, чтобы преобразовать все результаты Future[T]
в экземпляры Future[Try[T]]]
, все из которых наверняка будут успешными фьючерсами.
Примечание: здесь вы также можете использовать Option
или Either
, но Try
является самым чистым способом, если вы специально хотите улавливать исключения
def futureToFutureTry[T](f: Future[T]): Future[Try[T]] =
f.map(Success(_)).recover(x => Failure(x))
val listOfFutures = ...
val listOfFutureTrys = listOfFutures.map(futureToFutureTry(_))
Затем используйте Future.sequence
как и раньше, чтобы дать вам Future[List[Try[T]]]
val futureListOfTrys = Future.sequence(listOfFutureTrys)
Затем фильтр:
val futureListOfSuccesses = futureListOfTrys.map(_.filter(_.isSuccess))
Вы можете даже вытащить определенные сбои, если они вам понадобятся:
val futureListOfFailures = futureListOfTrys.map(_.filter(_.isFailure))
Вы не можете объединять подобные строки в агрегации mongoDB, вам нужно объединять строки с помощью оператора concat, поэтому функция createImageURL должна выглядеть примерно так,
module.exports.createImageURL = function ImageURL(){
return { $concat: [ "https://myhostingservice.com/", "$video_id", "/preview_image" ] };
};