我刚开始学习 mongodb java driver 的 async API。大多数示例覆盖 SingleResultCallback 的 onResult 方法,如下所示:
// get it (since it's the only one in there since we dropped the rest earlier on)
collection.find().first(new SingleResultCallback<Document>() {
@Override
public void onResult(final Document document, final Throwable t) {
System.out.println(document.toJson());
}
});
当执行查询并返回响应/错误时,将执行此回调。
但是,在 FindIterable 的情况下,我们需要覆盖 Block 的 apply 方法作为第一个参数和 SingleResultCallback 的 onResult 方法作为第二个参数。
FindIterable<Document> iterable = db.getCollection("restaurants").find();
// @code: end
// @pre: Iterate the results and apply a block to each resulting document
// @code: start
iterable.forEach(new Block<Document>() {
@Override
public void apply(final Document document) {
System.out.println(document);
}
}, new SingleResultCallback<Void>() {
@Override
public void onResult(final Void result, final Throwable t) {
System.out.println("Operation Finished");
}
});
我不明白为什么我们同时需要 Block 和 SingleResultCallBack。我们可以在 Block 中执行哪些我们不能用 SingleResultCallBack 做的事情/操作?
最佳答案
Block
应用于迭代的每个项目。 SingleResultCallback
在迭代完成后执行。com.mongodb.async.client.MongoIterable
的 javadoc 说:
关于MongoDB Java 异步驱动程序 : Block<Document> vs SingleResultCallBack<Document>,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31586525/