我刚刚开始学习mongodb java驱动程序的异步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方法覆盖为sencond参数。
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?
答案 0 :(得分:0)
Block
适用于迭代的每个项目。迭代完成后执行SingleResultCallback
。
com.mongodb.async.client.MongoIterable
的{{3}}说:
迭代视图中的所有文档,将给定的块应用于 每个,并在所有文件完成后完成返回的未来 迭代,或发生异常。