Вы можете сделать это хвостовой рекурсией:
def connect(url: String, succeeded: URLConnection=>Boolean, wait: Int): URLConnection = {
val conn = new URL(url).openConnection
if (succeeded(conn)) conn
else {
Thread.sleep(wait)
connect(url,succeeded,wait)
}
}
Или вы можете использовать бесконечный шаблон итератора, либо необработанный:
def connect(url: String, succeeded: URLConnection=>Boolean, waitMillis: Int) = {
val tries = Iterator.continually( new URL(url).openConnection )
tries.dropWhile(
conn => if (succeeded(conn)) false else { Thread.sleep(waitMillis); true }
).next
}
или путем переноса URL-вызова в ожидание, которое возвращает параметр (особенно полезно, если вы хотите обработать параметр в другом месте; не уверены, хотите ли вы встроить ожидание там или снаружи):
def attemptConnect(url: String, succeeded: URLConnection=>Boolean, waitMillis: Int) = {
val conn = new URL(url).openConnection
if (succeeded(conn)) Some(conn)
else { Thread.sleep(waitMillis); None }
}
def connect(url: String, succeeded: URLConnection=>Boolean, waitMillis: Int) = {
val tries = Iterator.continually( attemptConnect(url,succeeded,waitMillis) )
tries.dropWhile(_.isEmpty).next
}