Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在后台与服务人员一起运行函数_Javascript_Service Worker - Fatal编程技术网

Javascript 如何在后台与服务人员一起运行函数

Javascript 如何在后台与服务人员一起运行函数,javascript,service-worker,Javascript,Service Worker,我正在构建一个javascript Web应用程序。在那里,我想上传图片和其他数据到服务器。这一切都是工作,但我想使用的应用程序离线以及。因此,我实现了indexedDB,以脱机存储数据。此外,我还创建了一个sync函数,它将每5秒执行一次(setIntervall()…),以便在再次连接internet时将数据同步到服务器 问题是,此同步功能仅在应用程序打开时起作用。所以我研究了一种方法来解决我的问题,我有了一个后台同步的“服务人员”的想法 问题是我不知道如何实现它 这就是我目前拥有的(整个应

我正在构建一个javascript Web应用程序。在那里,我想上传图片和其他数据到服务器。这一切都是工作,但我想使用的应用程序离线以及。因此,我实现了indexedDB,以脱机存储数据。此外,我还创建了一个sync函数,它将每5秒执行一次(setIntervall()…),以便在再次连接internet时将数据同步到服务器

问题是,此同步功能仅在应用程序打开时起作用。所以我研究了一种方法来解决我的问题,我有了一个后台同步的“服务人员”的想法

问题是我不知道如何实现它

这就是我目前拥有的(整个应用程序都是用MVC概念编程的):

  • 我有一个包含以下代码的sw.js:
  • 控制器中有用于同步数据的函数sync()

您可以在
sw.js
文件中的“sync”事件处理程序中实现后台同步:

self.addEventListener('sync', function(event) {
  if (event.tag == 'myFirstSync') {
    event.waitUntil(() => {
      // Put your sync code here.
    });
  }
});
在注册服务人员后的某个时间点,您需要触发同步:

// Register your service worker:
navigator.serviceWorker.register('/sw.js');

// Then later, request a one-off sync:
navigator.serviceWorker.ready.then(function(swRegistration) {
  return swRegistration.sync.register('myFirstSync');
});
触发同步一次后,如果同步失败,则同步应继续自行重试(即使应用程序未在浏览器中打开)

如果失败,将安排另一次同步重试。同时重试同步 等待连接,并采用指数退避


请参阅以了解更多详细信息。

您能否澄清一点:-)您说“我不知道如何实现它”是什么意思?请务必查看这些资源:是的,我阅读了所有这些内容,但没有找到如何实现函数后台执行的确切文档:(不,这对我不起作用,我在sw.js文件中编写了这段代码,我可以在chrome的开发工具中看到ServiceWorker,但他在Waitill()之后没有执行代码)…是否缺少任何内容?是否必须将第二个代码放入控制器或sw.js?@90minutes2go-中的sw.js文件中。您不能从代码库中的任何其他位置执行/调用任何函数。Service Worker与普通浏览器页面一样,有其自己的执行上下文。您的页面看不到内部定义的函数和变量e SW.js,反之亦然。@90minutes2go第一个代码段进入服务工作者。第二个代码段进入应用程序代码,其目的是注册服务工作者并注册同步事件。
// Register your service worker:
navigator.serviceWorker.register('/sw.js');

// Then later, request a one-off sync:
navigator.serviceWorker.ready.then(function(swRegistration) {
  return swRegistration.sync.register('myFirstSync');
});