当连接重新恢复时,使用哪些模式来与REST-ful服务器同步挂起的请求?这种情况下
Background Sync API将是合适的选择。它使Web应用程序能够在后台同步数据。使用它可以推迟操作直到用户有可靠的连接,确保用户想要发送的任何内容都被发送。即使用户导航离开或关闭浏览器,该操作也会执行,如果需要,您可以通知用户。由于正在保存到IndexDB,因此可以在用户添加、删除或更新TODO项目时注册同步事件。
function addTodo(todo) {
return addToIndeDB(todo).then(() => {
return navigator.serviceWorker.ready;
}).then(reg => {
return reg.sync.register('add-todo');
}).then(() => {
console.log('Sync registered!');
}).catch(() => {
console.log('Sync registration failed :(');
});
}
你注册了一个同步事件,类型为
add-todo
,在service-worker中监听该事件,当收到该事件后,从IndexDB检索数据并进行POST到你的Restful API。
self.addEventListener('sync', event => {
if (event.tag == 'add-todo') {
event.waitUntil(
getTodo().then(todos => {
return fetch('/add', {
method: 'POST',
body: JSON.stringify(todos),
headers: { 'Content-Type': 'application/json' }
}).then(() => {
});
})
})
);
}
});
这只是使用后台同步实现它的示例。请注意,您必须在服务器上处理冲突解决。
您可以在客户端使用PouchDB,并在服务器上使用Couchbase或CouchDB。使用PouchDB客户端,您可以在客户端保存数据,并设置自动同步/复制数据,以便每当用户在线时都会进行同步。当数据库同步并存在冲突更改时,CouchDB将检测到此情况,并将用特殊属性“_conflicts:true”标记受影响的文档。它确定哪一个应该作为最新版本,并将其他版本保存为该记录的上一个版本。它不尝试合并冲突的修订。在您的应用程序中,由您来决定如何进行合并。这与Couchbase并没有太大区别。有关冲突解决的更多信息,请参见下面的链接。
我使用过PouchDB和Couchbase / CouchDB / IBM Cloudant,但是我是通过Hoodie来完成的。它具有开箱即用的用户身份验证、处理冲突管理等功能,类似于您的后端。在您的TODO应用程序中,Hoodie将非常适合。我写了一些关于如何使用Hoodie的东西,请查看以下链接: