【发布时间】:2017-07-07 10:09:12
【问题描述】:
我正在尝试学习节点。 考虑这段代码(基于官方 MongoDB Node.js 驱动)
// Retrieve all the documents in the collection
collection.find().toArray(function(err, documents) {
assert.equal(1, documents.length);
assert.deepEqual([1, 2, 3], documents[0].b);
db.close();
});
我有两个问题:
-
find是同步的还是异步的? -
如果它是异步的,
.toArray函数调用会让我感到困惑,因为通常我会期望类似collection.find(function(err, results){});
我特别感兴趣什么机制允许你在异步函数的结果上调用.toArray?因为我得到的异步函数很少返回一些东西(我认为除了承诺),而是调用传递给它们的回调。有人可以用 find 和 .toArray 澄清这种情况吗?
例如在这个问题的接受答案中:How to get a callback on MongoDB collection.find(),你可以看到作者以我想象的方式调用find,并在回调函数中收到cursor。这对我来说很好,这就是我期望它的工作方式。
但是chaining异步调用find的结果(如果它是异步的?),toArray有点让我困惑。
我的猜测是find返回一个句柄之类的东西,此时数据还没有从DB加载,只有当你调用toArray时实际数据到达。我说的对吗?
【问题讨论】:
-
这种混乱是否来自 API 更改? v2.2 中的
find返回一个带有各种方法的Cursor(toArray是其中之一)。在 v1.4 中,find接受多个参数,其中一个是可选的callback(同时仍返回cursor)。 -
@forrert 是的,这也是造成混乱的因素。那么在2.2中find同步返回游标对象呢?
-
正如下面的答案很好地指出的那样,在这两种情况下,游标都是同步返回的。请记住,异步运行某些内容的函数仍然可以返回某些内容(例如光标)。游标函数也期望回调接收查询结果。
标签: javascript node.js mongodb