2013-09-09 2 views
2

soundcloud의 javscript connect oauth2 흐름에서 오류 시나리오를 고려하려고합니다.
1. Soundcloud 시작은 SC.connect(my_callback_fn)
2. 사용자가 "Connect"또는 "Cancel"앱 인증을 요청하는 aound-Cloud 페이지가있는 팝업 창이 열립니다.
3. 사용자가 "취소"를 클릭합니다. (여기가 내가 갇혀있다)soundcloud oauth2 오류 처리 방법

사용자가 취소를 클릭하면 window.opener (일명 부모 페이지)에서 sdk의 자바 스크립트 오류가 표시됩니다. 나는 이것을 더 우아하게 다루고 싶다.
현재 window.onerror에 이벤트 처리기가있어 오류 문자열을 찾아 적절하게 처리합니다. 이 메서드는 다른 모든 js 오류에 대해서도 호출 될 것이므로이 오류를 처리하는 더 좋은 방법을 찾고있었습니다. 감사. 예외를 잡을 수있는 가장 빠른 방법은 대화의 콜백을 덮어 쓸 것입니다
Uncaught Error: SC OAuth2 Error: The end-user denied the request. sdk.js:1
(anonymous function) sdk.js:1
window.SC.SC.Helper.merge.Dialog.AbstractDialog.AbstractDialog.handleReturn sdk.js:1
window.SC.SC.Helper.merge.Dialog._handleDialogReturn sdk.js:1
window.SC.SC.Helper.merge.connectCallback

답변

2

조금 더러운하지만 :

나는 다음과 같은 JS 오류 추적을 얻을. SC.connect() 메서드는 대화의 인스턴스를 반환, 그래서 당신은 할 수 있습니다 당신은 예외 기다리지 않으려면

var dialog = SC.connect(function() { 
    // Connected! 
}); 
var originalCallback = dialog.options.callback; 
dialog.options.callback = function() { 
    try { originalCallback.apply(this, arguments); } catch (e) { 
     // Error! 
    } 
}; 

, 당신은 단순히를 얻기 위해 콜백의 첫 번째 인수를 사용할 수 있습니다 오류가있는 경우 :

dialog.options.callback = function (params) { 
    if (params.error) console.log(params.error_description); 
    else originalCallback.apply(this, arguments); 
}; 

은 또한 당신이 사용자가 "취소" "연결"또는 클릭하지 않고, 그것을 폐쇄 여부를 확인하기 위해 주기적으로 대화 개체에 타이머를 설정할 수 있습니다. 브라우저는 다른 도메인 (이 경우에는 SoundCloud)이있는 윈도우의 속성을 설정할 수 없으므로 onunload를 사용할 수 없습니다. 즉, dialog.options.window의 속성 중 하나에 액세스하려고 시도하는 예외가 발생하는 경우 - 창이 여전히 열려 있음을 의미합니다.

참고 : params의 내용이 쿼리 문자열로 콜백 URL에 처음 전달되기 때문에 SoundCloud에서 오는 오류를 잡는 또 다른 방법은 callback.html (SoundCloud 콜백 URL)을 직접 수정하는 것입니다. (onload 함수에있는) 다른 콜백을 호출하기 만하면된다.

+0

사용자가 창을 닫았는지 확인하기 위해'dialog.options.window.closed'를보다 신뢰성있게 호출한다. – Thomas