2

푸시 등록이 실패한 경우 특정 작업을 수행하려고합니다. 구독을 실패하게하려면 <link>을 (Chrome을 사용하고 있습니다) manifest.json 파일로 삭제했습니다. 나는 다음과 같은 오류가 발생할 수 얻을 같이푸시 구독 오류 캐치가 발생하지 않습니다.

function subscribe() { 
    navigator.serviceWorker.ready 
    .then(function(reg) { 
    reg.pushManager.getSubscription() 
    .then(function(sub) { 
     if (!sub) { 
     reg.pushManager.subscribe({userVisibleOnly: true}) 
     .then(function(subscription) { 
      console.log('Subscribed to push,', subscription); 
     }); 
     } else { 
     console.log('Already subscribed'); 
     } 
    }); 
    }) 
    .catch(function(e) { 
    console.log('catch!'); 
    // Do something 
    }); 
} 

을 그리고 catch 블록이다 (I 결과로 의심) :

Uncaught (in promise) DOMException: Registration failed - manifest empty or missing 

그러나이 오류가 가입 코드가 살고보다는 main.jsindex.html:1에서 온다 방아쇠를 당기지 말라. 이게 올바른 행동입니까 아니면 뭔가 잘못하고있는 것입니까?

자세한 내용 : 은 내가 (캐시하지 않는 한 사용할 수없는 오프라인 것) manifest.json에 대한 링크를 삭제 한 이유는 오프라인 동작을 시뮬레이션하기 위해 노력하고 있습니다. 앱이 오프라인이어서 구독이 실패한 경우 catch에서 조치를 취하고 싶습니다 (예 : 애널리틱스 조회 또는 UI 업데이트 대기).

+1

를 제외하고 (의견과 같이 다른 비동기 "수준"을 위해, 나는 또한, 이에 상응하는 약속을 위해 어획량을 추가해야한다고

navigator.serviceWorker.ready .then(function(reg) { reg.pushManager.getSubscription() .then(function(sub) { if (!sub) { reg.pushManager.subscribe({userVisibleOnly: true}) .then(function(subscription) { console.log('Subscribed to push,', subscription); }) // Catch here now! .catch(function(e) { console.log('catch statements must be on the same level!'); }); } else { console.log('Already subscribed'); } }); // could add catch here too }); // no catch needed here, serviceWorker.ready never rejects 

참고. catch가 reg.pushManager.getSubscription()에 대해 처리되어야하고 then(). catch()가 구독을 확인하지 못했습니다. – vbharath

+0

아! 물론입니다. 나는 이것을 모른 채 약속을 사용하여 멀리까지 얻은 방법을 모르겠습니다. 고마워요 !! FYI처럼 실제로는'reg.pushManager.subscribe ({userVisibleOnly : true}) '가 던져 버리기 때문에'catch'가 있어야합니다. 그 수준에서. –

답변

1

@bvakiti가 그의 의견에서 말한 바와 같이, catch 블록은 거절 약속과 동일한 "레벨"에 있어야합니다. 이 경우 reg.pushManager.subscribe({userVisibleOnly: true}) 코드가 오류를 throw하는 코드이므로 해당 약속 체인 끝 부분에 catch이 있어야합니다. 업데이트 된 코드 :. serviceWorker.ready 약속, 실제로 never rejects