2016-08-04 4 views
2

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입니다.

감사합니다.

조지

+1

의 약속을 사용 IDB와 약속을 혼합 할 때주의해야 , 항상 잘 어울리는 것은 아닙니다. https://crbug.com/457409의 예를 참조하십시오. – dgrogan

+0

감사합니다. 이걸 좀 더 설명해 주시겠습니까? sendAllFromOutbox 함수는 함수 호출 여부를 제어 할 것이라고 생각했습니다.이것은 이전 IDB 호출에서 데이터를 가져 오는 fetch 일뿐입니다. 내가 오해한다면 사과하고, 약속을 처음으로! –

+0

IDB와 약속은 이전보다 훨씬 좋습니다. https://jakearchibald.com/2015/tasks-microtasks-queues-and-schedules/ –

답변

1

그것은 실패한 동기화 이벤트가 시도되어야 할 때를 결정하기 위해 아래 브라우저입니다. 또한 무한히 재 시도하지는 않지만 syncEvent.lastChance (spec)을 통한 마지막 시도라는 것을 알고 있습니다.

databaseGet(type,db)을 기대하고, 위의 코드를 보면,하지만 당신은 시도하고 db의 속성에 액세스 할 때 그 정의 인 오류가 발생합니다, 그래서 당신은 databaseGet('posts')를 호출. Chrome의 devtools에이 오류가 표시되어야합니다. 특히 "catch on errors"와 함께. 배경 그것은 사용자의 현재 상태에 관계없이 배경 동기화를 사용하는 것이 가장 좋습니다

에 보내 - 사용자가 오프라인 상태이며 게시물을 보내려고하는 경우 여기를

생각입니다. 물론 navigator.onLine은 사용자가 확실히 오프라인 상태인지 여부를 알려주지 만 onLine이 참이면 사용자는 여전히 안정적인 연결을 유지하지 못할 수 있습니다.

+0

을 참조하십시오. 나는 당신의 예제를 온라인으로 사용했고 그것을 변경하여 글로벌 db를 제거하고 체인을 통과시켰다. 나는 함수의 이전 버전을 복사해야합니다, 사과! 아직 재 시도가없는 것으로 나타납니다. 내 리포에서 전체 코드를 사용할 수 있습니다 - https://github.com/georgecook92/Stir/blob/master/sw.js 모든 요청에 ​​대해 동기화 사용에 관해 조언 해 주셔서 감사합니다. 응답을 감사하십시오! –