缓存第一个实现以进入 Firestore

Sac*_*aik 6 javascript firebase google-cloud-firestore

我希望 Firestore 每次都首先从缓存中获取数据。根据 Firestore 文档,传递“缓存”或“服务器”选项必须启用相同的选项。下面的例子

db.collection("cities").where("capital", "==", true)
    .get("cache")
    .then(function(querySnapshot) {
        querySnapshot.forEach(function(doc) {
            // doc.data() is never undefined for query doc snapshots
            console.log(doc.id, " => ", doc.data());
        });
    })
    .catch(function(error) {
        console.log("Error getting documents: ", error);
    });
Run Code Online (Sandbox Code Playgroud)

但是,无论我设置“缓存”还是“服务器”,查询似乎都先尝试网络,然后再尝试缓存。

Fra*_*len 7

由于 aget()只获取一次您的 a 值,因此它将始终检查来自服务器的数据的最新值。如果这是您应用中的第一个 Firestore 操作,则可能需要它建立与数据库的网络连接,这可能需要一些时间。

如果您想快速从缓存中获取数据,然后再从服务器获取修改,请使用onSnapshot

db.collection("cities").where("capital", "==", true)
    .onSnapshot(function(querySnapshot) {
        querySnapshot.forEach(function(doc) {
            // doc.data() is never undefined for query doc snapshots
            console.log(doc.id, " => ", doc.data());
        });
    })
    .catch(function(error) {
        console.log("Error getting documents: ", error);
    });
Run Code Online (Sandbox Code Playgroud)

另请参阅有关获取实时更新Firestore 文档

要告诉get()从缓存返回数据,请执行以下操作:

db.collection("cities").where("capital", "==", true)
    .get({ source: 'cache' })
    .then(function(querySnapshot) {
        ...
Run Code Online (Sandbox Code Playgroud)

但请注意,这意味着您永远不会从服务器获得更新的值。

  • 每次我们首先需要离线数据时使用“快照”是一个好习惯吗?即使我们需要一次数据?我的意思是,它会使实现变得复杂,特别是当我们需要很少的数据来从几个独立的对象中获取数据时 (4认同)