zoukankan      html  css  js  c++  java
  • [PWA] 15. Using The IDB Cache And Display Entries

    We want to use IDB to store the wittr messages. 

    The logic is when the page start:

    1. service worker will read the skeleton from the cache and show to the interface.
    2. read the message data from the IDB first instead of going to network.
    3. Show the data from IDB then open socket to fetch updated wittr.
    4. Once data arrive, update the interface and save into IDB.
    export default function IndexController(container) {
      this._container = container;
      this._postsView = new PostsView(this._container);
      this._toastsView = new ToastsView(this._container);
      this._lostConnectionToast = null;
      this._openSocket();
      this._dbPromise = openDatabase();
      this._registerServiceWorker();
    }

    In openDatabase(), we create Wittr db, set id as primary key and time as index called 'by-time'

    function openDatabase() {
      // If the browser doesn't support service worker,
      // we don't care about having a database
      if (!navigator.serviceWorker) {
        return Promise.resolve();
      }
    
       return idb.open('wittr', 1, function(upgradeDb){
          const store = upgradeDb.createObjectStore('wittrs', {
            keyPath: 'id'
          });
    
        store.createIndex('by-date', 'time');
      });
    }

    In _openSocket, we have a function to fetch the old data from the IDB.

    // open a connection to the server for live updates
    IndexController.prototype._openSocket = function() {
    

    ... ws.addEventListener('message', function(event) { requestAnimationFrame(function() { indexController._onSocketMessage(event.data); }); }); ... };
    // called when the web socket sends message data
    IndexController.prototype._onSocketMessage = function(data) {
      var messages = JSON.parse(data);
    
      this._dbPromise.then(function(db) {
        if (!db) return;
    
        // TODO: put each message into the 'wittrs'
        // object store.
        const tx = db.transaction('wittrs', 'readwrite');
        const wittrs = tx.objectStore('wittrs');
        messages.forEach( (message) => {
          wittrs.put(message);
        });
    
        return tx.complete;
      });
    
      this._postsView.addPosts(messages);
    };
  • 相关阅读:
    【工具】sublime使用技巧
    怎样存钱利息最大及怎样买房付款最省钱问题
    存钱问题
    玛丽莲问题
    用线程做一个火车票购票系统(可以根据需要选择线程个数)
    系统编程拷贝文件或者目录(可以做出一个动态库哦)
    mysql优化-数据库设计基本原则
    项目 数据可视化1
    读书笔记2-三体
    python数据学习3 布林带
  • 原文地址:https://www.cnblogs.com/Answer1215/p/5510731.html
Copyright © 2011-2022 走看看