我有一些 Scala 代码应该查询网络服务以获取某个令牌,然后将该令牌与预期的令牌进行比较。我想继续查询预期的令牌,直到找到它,或者直到我进行了 N 次不成功的尝试。
以下是如何以 Java 语言方式完成的:
def keepLooking(expectedToken: String, maxTries: Int) {
var tries = 0
var token = ""
do {
Thread.sleep(tries * 1000) // don't overwhelm the service by calling it too fast!
token = makeSomeNetworkCall()
tries += 1
} while (tries <= maxTries && token != expectedToken)
}
我想在功能上做得更多。我有一个想法:
1.to(maxTries) map { tryNum =>
Thread.sleep(tryNum - 1 * 1000) // don't overwhelm the service by calling it too fast!
makeSomeNetworkCall()
} exists (_ == expectedToken)
但这提出了两个问题:
map
很懒,所以exists
应该短路吧?如果我在第二次通话中找到我的令牌,我不想进行 10 次网络通话。- 有没有更惯用的方法来实现我想要的?