首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在PWA中联机(wifi打开)时,后台同步代码无法自动工作

在PWA中联机(wifi打开)时,后台同步代码无法自动工作
EN

Stack Overflow用户
提问于 2018-05-18 15:02:31
回答 2查看 1.3K关注 0票数 0

我是PWA的新手,一直在使用firebase控制台数据库测试我的PWA项目。在离线时,当我提交我的帖子数据时,我有代码将帖子数据保存在indexedDB中,以便稍后在有WiFi(在线)时保存。它确实在找不到WiFi时将数据保存在indexedDB中,但当我打开我的WiFi时,它不会实时发布我的数据。当我在wifi (在线)上提交新的post数据时,后台同步代码会实时发布来自indexedDB的新post数据。但我希望我的后台同步代码在WiFi打开(离线后)时自动发布。

下面是我的后台同步服务工作者代码:

代码语言:javascript
复制
self.addEventListener('sync', function(event) {
  console.log('Background syncing...', event);
  if (event.tag === 'sync-new-posts') {
    console.log('Syncing new Posts...');
    event.waitUntil(
      readAllData('sync-posts') // function to read all saved data which had been saved when offline
        .then(function(data) {
          for (var dt of data) {
            fetch('xxx some firebase post url xxx', { // fetching for sending saved data to firebase database
              method: 'POST',
              headers: {
                'Content-Type': 'application/json',
                'Accept': 'application/json'
              },
              body: JSON.stringify({
                id: dt.id,
                title: dt.title,
                content: dt.content
              })
            })
              .then(function(res) {
                console.log('Sent data', res);
                if (res.ok) {
                    res.json()
                        .then(function (resData) {
                            deleteItemFromData('sync-posts', resData .id); // function for deleting saved post data from indexedDB as we donot need after realtime post is saved when online.
                        });
                }
              })
              .catch(function(err) {
                console.log('Error while sending data', err);
              });
          }
        })
    );
  }
});

我不知道哪里出了问题。如果任何人需要更多我的邮寄代码或服务人员代码,以便更清楚,请尽管问。我被困在这里了,请帮帮我。

EN

回答 2

Stack Overflow用户

发布于 2018-05-18 22:52:27

你能做的就是检查你的应用程序是否再次在线或者没有使用Online and offline events。这是一个文档齐全的JS,也是widely supported

代码语言:javascript
复制
window.addEventListener('load', function() {
  function updateOnlineStatus(event) {
    if (navigator.onLine) {
      // handle online status
      // re-try api calls
      console.log('device is now online');
    } else {
      // handle offline status
      console.log('device is now offline');
    }
  }

  window.addEventListener('online', updateOnlineStatus);
  window.addEventListener('offline', updateOnlineStatus);
});                        

注:它只能判断设备是否已连接。但它不能区分工作的互联网连接或仅仅是一个连接(例如,没有实际互联网连接的WiFi热点)。

因此,我建议你在navigator.onLine事件中做一个假的API调用,只是为了检查实际的互联网是否恢复了(也可以是一个简单的握手),一旦成功,你就可以继续进行常规的API调用。

票数 1
EN

Stack Overflow用户

发布于 2019-03-03 23:24:07

检查重新加载时更新是否已关闭,以及您是否完全脱机。我也遇到了同样的问题,当重新加载时更新被关闭时,它会随机地开始工作。我认为这是因为它会在您每次刷新页面时重新安装服务工作者,因此您不会处于服务工作者正在侦听同步的状态。不管怎么说,这就是我的理论。希望这能帮到你。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50405573

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档