2013-11-26 8 views
1

У меня есть Future и функция, которую я хочу выполнить после завершения Future. И верните новый Future.Chain 2 futures - рассчитать один и вернуть еще

Я хочу создать функцию, делая это, но я не могу:

def chain(fut: Future[A], continueFun: Future[A] => B): Future[B] = future { 
    fut onComplete { case Success(x) => continueFun(x) } // ops, Unit 
}  

Я опустил onFailure для простоты.

Однако onComplete, onSuccess и onFailure - все они возвращаются Unit. Как мне вернуть Future[B] после завершения Future[A]?

+0

Важно, чтобы 'continueFun' воспринимал будущее как аргумент? в противном случае я думаю, что вы могли бы просто сделать 'futureA.map (continueFun)' – tehlexx

+0

@tehlexx, да, это так. –

ответ

3

Основная проблема немного сложнее, но вы можете, однако, flatMap и map. Поведение join уже определено.

for { 
    a <- someFuture 
    b <- someOtherFuture 
} yield { 
    a + b // or whatever goes here 
} 

Вы можете даже последовательность:

for { 
    resultOfFuture <- someFuture 
    nextResult <- getResult(resultOfFuture) // chaining them 
} yield { 
    // etc 
} 


def chain[A, B](fut: Future[A], continueFun: Future[A] => B): Future[B] = { 
    for { 
     a <- fut 
    } yield { 
     continueFun(fut) 
    } 
    } 
+0

как он применим к моей «цепочке»? –

+0

если это не так, почему вы дали мне это в качестве ответа? –

+0

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

1

Обещание может быть использован для цепи фьючерсов.

def chain[A, B](fut: Future[A], continueFun: Future[A] => B): Future[B] = { 

    val p = Promise[B]() // A promise that will be completed after fut completes. 

    fut onComplete { case Success(x) => p success continueFun(fut) 
        case Failure(ex) => p failure ex } 

    p.future // this future will be completed by the promise, which in turn will be completed by fut. 

} 
+0

Я тоже думал о Обещании. –

Смежные вопросы