IndexedDB 및 서비스 근로자를 활용하는 오프라인 첫 번째 블로깅 플랫폼을 만들고 있습니다. 여기서 아이디어는 사용자가 오프라인 상태이고 게시물을 보내려는 경우입니다. 백그라운드에서 보낼 수 있습니다. 이 프로젝트는 내 논문을위한 것입니다, 나는 단지 1 주일 정도의 약속을 보았습니다 - 간단한 오류라면 사과드립니다!서비스 작업자 백그라운드 동기화 - 약속을 거부 할 때 - waitUntil에서 재 시도가 없습니다?
react/redux의 제 조치에서 동기화 이벤트를 성공적으로 보냈습니다. 다음은
아래는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 내 동기 이벤트 핸들러 코드입니다 - (색인화) 아래
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;
});
}
이
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;
});
}
그리고 마지막으로 databaseGet
, 아래 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입니다.
감사합니다.
조지
의 약속을 사용 IDB와 약속을 혼합 할 때주의해야 , 항상 잘 어울리는 것은 아닙니다. https://crbug.com/457409의 예를 참조하십시오. – dgrogan
감사합니다. 이걸 좀 더 설명해 주시겠습니까? sendAllFromOutbox 함수는 함수 호출 여부를 제어 할 것이라고 생각했습니다.이것은 이전 IDB 호출에서 데이터를 가져 오는 fetch 일뿐입니다. 내가 오해한다면 사과하고, 약속을 처음으로! –
IDB와 약속은 이전보다 훨씬 좋습니다. https://jakearchibald.com/2015/tasks-microtasks-queues-and-schedules/ –