我在MongoDB中插入记录:
val observable: Observable[Completed] = collection.insertOne(doc)
observable.subscribe(new Observer[Completed] {
override def onNext(result: Completed): Unit = { println("Inserted"); }
override def onError(e: Throwable): Unit = { println(" \n\nFailed " + e + "\n\n"); fail() }
override def onComplete(): Unit = { println("Completed"); }
})
即使调用onError
回调,测试也会通过。这是因为insertOne
是一个异步方法,测试在调用onError
之前完成。我想将insertOne方法包装到阻塞调用中,因此在设置subscribe
值之前不会调用observable
。
在Scala中是否存在实现此目的的惯用方法?
答案 0 :(得分:2)
同步阻止异步操作的最简单方法是在Future
上使用Await.result
。由于MongoCollection.insertOne
会返回Observable[Complete]
,因此您可以在其上使用隐式ScalaObservable.toFuture
:
val observable = collection.insertOne(doc)
Await.result(observable.toFuture, Duration.Inf)
observable.subscribe(new Observer[Completed] {
override def onNext(result: Completed): Unit = { println("Inserted"); }
override def onError(e: Throwable): Unit = { println(" \n\nFailed " + e + "\n\n"); fail() }
override def onComplete(): Unit = { println("Completed"); }
})