IndexedDB とサービス ワーカーを利用するオフラインの最初のブログ プラットフォームを作成しています。ここでの考え方は、ユーザーがオフラインで投稿を送信しようとしている場合に、バックグラウンドで送信するというものです。このプロジェクトは私の学位論文のためのものです。私はプロミスを 1 週間程度しか見ていません。単純なエラーである場合は申し訳ありません。
反応/還元での私の行動から、同期イベントを正常に送信しています。
以下は私の同期イベントハンドラのコードです
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にあります。
ありがとうございました!
ジョージ