提问者:小点点

为什么使用异步函数从firestore数据库中查询数据时会得到两个不同的输出呢?


我想我没有正确地获得用于Node.js的Google Firestore API。所以我想问一下,后面两次执行,后台发生了什么,因为我得到了两个不同的结果。

第一:

async function getDocument(db, path) {
    const cityRef = db.doc(path);
    const doc = await cityRef.get();
    if (!doc.exists) {
      console.log('No such document!');
    } else {
      console.log('Document data:', doc.data());
    }
  }
const aDatabase = admin.firestore();
const aPath = 'path/to/document';
getDocument(aDatabase, aPath);

这是我在Firestore文档中找到的第一个代码片段。它按预期工作。doc的类型是DocumentQuerySnapshot。我可以像往常一样访问文档的数据。一切都很好。在控制台中,输出是一个包含存储数据的JSON-Object。

第二:

async function getDocument(db, path) {
    const cityRef = db.doc(path);
    const doc = await cityRef.get();
    if (!doc.exists) {
      console.log('No such document!');
    } else {
      console.log('Document data:', doc.data());
      return doc.data();
    }
  }
const aDatabase = admin.firestore();
const aPath = 'path/to/document';
const docData = getDocument(aDatabase, aPath);
console.log('docData:', docData);

此代码段仅由最后两行扩展。在本例中,docData不再是DocumentQuerySnapshot。这是一个悬而未决的承诺。那就是我生气的时刻。我无法访问文档的数据。我可以,如果我做一些类似docdata.then(。。。)的事情。但是为什么函数“get document”会突然返回一个承诺。


共1个答案

匿名用户

async函数总是返回承诺。若要访问最终值,您需要调用promise上的。然后调用,并指定promise解决后要运行的代码:

getDocument(aDatabase, aPath)
  .then(docData) => {
    console.log('docData:', docData);
  })

或者将代码放在async函数中并使用await:

async function someFunction() {
  // ...
  const docData = await getDocument(aDatabase, aPath);
  console.log('docData:', docData);
}

注意,即使在第一个示例中,您也必须等待一个承诺:

const doc = await cityRef.get();

这允许异步函数的其余部分等待操作完成后再继续。如果您希望调用getDocument的代码也等待,那么它也需要执行await。