是否可以手动添加到服务工作者缓存?

时间:2018-08-01 01:31:07

标签: dart service-worker

我正在尝试创建一个与Service Worker配合使用的接口,但目前希望它能够写入缓存本身。

如果不可能,了解网络不可用时是否将使用过期的缓存资源将很有帮助。

编辑特别是Response公共构造函数不允许指定正文数据,并且Cache.put()需要Response

1 个答案:

答案 0 :(得分:1)

  

我正在尝试创建一个与Service Worker配合使用的接口,但目前希望它能够写入缓存本身。

Cache Storage API在服务工作者内部很有用,但不仅限于ServiceWorkerGlobalScope。在普通网页上,它也exposedwindow.caches。因此,您可以从网页或服务工作者(或web worker)读取和写入相同的缓存。

  

如果不可能,了解网络不可用时是否将使用过期的缓存资源将很有帮助。

在Cache Storage API中没有“过期的缓存资源”的概念。如果您要查询的是Cache-Control头,则将有效地忽略已缓存的Response中的Response头。因此,只要将fetch存储在缓存中,您就可以读取并使用它。但是不会自动使用任何内容-您需要专门设置服务工作者的fetch()事件处理程序,并添加确定在各种情况下会发生什么的逻辑。可以在“ The Offline Cookbook”中找到关于如何编写服务工作者代码的良好概述。

例如,here's a fetch handler会首先通过访问网络(通过self.addEventListener('fetch', function(event) { event.respondWith( fetch(event.request).catch(function() { return caches.match(event.request); }) ); }); )来响应所有网络请求,如果拒绝,则尝试使用相同URL的缓存响应进行响应:< / p>

 import 'package:firebase_database/firebase_database.dart';
    import 'User.dart';
    import 'dart:async';


    class FireDatabase{
      FireDatabase();

      DatabaseReference userRef = FirebaseDatabase.instance.reference().child("users");
      DatabaseReference transactionsRef = FirebaseDatabase.instance.reference().child("transactions");
      User user = new User();


     getDatabaseUser(String cUid){
        userRef.orderByChild(cUid).once().then((DataSnapshot data){
          if (data.value!=null) {
            return data.value;
          } else {
            print("prints - database.dart : data.value of user is empty/null");
            return null;
          }
        },onError: (e){
          print("prints - database.dart " + e.toString());
          return null;
        });
        return null;
      }

      getDatabaseTransactions(String cUid) {
        transactionsRef.orderByChild("transactions").once().then((DataSnapshot data){
          if(data.value!=null) {
            return data.value;
          } else {
            print("prints - database.dart : data.value of user is empty/null");
            return null;
          }
        },onError: (e){
          print("prints - database.dart " + e.toString());
          return null;
        });
        return null;
      }

      getDatabaseTransaction(String cUid) {
        transactionsRef.orderByChild(cUid).limitToFirst(1).once().then((DataSnapshot data){
          if(data.value!=null) {
            return data.value;
          } else {
            print("prints - database.dart : data.value of user is empty/null");
            return null;
          }
        },onError: (e){
          print("prints - database.dart " + e.toString());
          return null;
        });
        return null;
      }

    }