Фоновая синхронизация работника службы - при отклонении обещания - нет повторных попыток в waitUntil?
Я создаю первую автономную блог-платформу, которая использует IndexedDB и сервисных работников. Идея в том, что если пользователь не в сети и пытается отправить сообщение, отправьте его в фоновом режиме. Этот проект предназначен для моей диссертации, я смотрю на обещания в течение недели или около того - извинения, если это простая ошибка!
Из моих действий в реагировать / редукса я успешно отправляю событие синхронизации.
Ниже приведен код для моего обработчика событий синхронизации
self.addEventListener('sync', function(event) {
if (event.tag == 'send_post') {
//const URL
console.log('sync from SW - send post');
//this should try again if promise is rejected
event.waitUntil(
openDatabase('Outbox').then( (db) => {
return databaseGet('posts',db).then( (posts) => {
return sendAllFromOutbox(posts)
} )
} )
);
}
});
Ниже находится openDatabase - (IndexedDB)
function openDatabase(name) {
return new Promise(function(resolve, reject) {
var version = 10;
var request = indexedDB.open(name, version);
var db;
request.onupgradeneeded = function(e) {
db = e.target.result;
e.target.transaction.onerror = reject;
};
request.onsuccess = function(e) {
db = e.target.result;
console.log('OPENED DATABASE');
resolve(db);
};
request.onerror = reject;
});
}
Ниже находится databaseGet
function databaseGet(type,db) {
return new Promise(function(resolve, reject) {
var transaction = db.transaction([type], 'readonly');
var store = transaction.objectStore(type);
var request = store.getAll();
request.onsuccess = function(e) {
var result = e.target.result;
resolve(result);
};
request.onerror = reject;
});
}
И, наконец, ниже sendAllFromOutbox
function sendAllFromOutbox(posts) {
return fetch('https://stirapi.herokuapp.com/sendPost', {
headers: {'Content-Type': 'application/json'},
method: "POST",
body: JSON.stringify(posts)
})
.then( (response) => {
console.log('response from SW sendAllFromOutbox', response);
} )
.catch( (err) => {
console.log('error from SW sendAllFromOutbox',err);
} )
}
Насколько я понимаю, если sendAllFromOutbox не удается / отклоняет - он должен быть вызван снова. Но, похоже, его не вызывают - и, следовательно, не отправляют в фоновом режиме.
Если вы хотите проверить мой репо - он находится здесь https://github.com/georgecook92/Stir.
Спасибо!
Джордж
1 ответ
Браузер должен решить, когда событие неудачной синхронизации следует повторить. Кроме того, он не будет повторяться бесконечно, но вы знаете, что это последняя попытка через syncEvent.lastChance
( спец)
Глядя на ваш код выше, databaseGet
надеется (type,db)
, но ты называешь это databaseGet('posts')
, так что вы получите ошибку при попытке доступа к свойствам db
, который не определен. Devtools в Chrome должны показать это, особенно с "ошибкой при обнаружении ошибок".
Идея в том, что если пользователь не в сети и пытается отправить сообщение, отправьте его в фоновом режиме.
Лучше использовать фоновую синхронизацию независимо от текущего состояния пользователя. Конечно, navigator.onLine
скажет вам, если пользователь определенно не в сети, но если onLine
Это правда, что пользователь все еще не может иметь надежное соединение.
- Руководство по фоновой синхронизации
- Руководство к обещаниям
- Обещанный IDB - тот же API IDB, но использует обещания вместо событий