我正在尝试学习节点。 请考虑此代码(基于官方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
?因为我得到的异步函数很少返回一些东西(我认为除了promises),而是调用传递给它们的回调。有人可以通过find和.toArray
澄清这种情况吗?
例如,在此问题的接受答案中:How to get a callback on MongoDB collection.find(),您可以按我设想的方式看到作者调用find
,并在回调函数中收到cursor
。这对我很好,这就是我期望它的工作方式。
但链接异步调用find
的结果(如果它是异步?),toArray
有点混淆了我。
我的猜测是find
返回句柄类型的东西,此时的数据还没有从DB加载,只有当你调用toArray
实际数据到达时才会这样。我是对的吗?
答案 0 :(得分:5)
我承认你,这个案子有点奇怪。这是mongodb-native的v2.2。
首先,find
有two different usages。你可以给出回调函数。但在无论如何中,它会返回同步一个对象。更确切地说,它是cursor。
传递回调时我们可以期待一种异步机制,但不是这里。
collection.find({ }, function (err, cursor) {
assert(!err);
});
console.log('This happens after collection.find({ }, callback)');
或强>
const cursor = collection.find({});
console.log('Also happening after');
另一方面,toArray
是一个异步函数,也有两种不同的用法。这次,返回的对象因参数而异。
等同于:
cursor.toArray(function (err, documents) {
assert.equal(1, documents.length);
});
和强>
cursor.toArray()
.then(documents => {
assert.equal(1, documents.length);
});
在第一次通话中,toArray
会返回undefined
,而在第二次通话中,会返回Promise
。