2

私は、soundcloud の javascript connect oauth2 フローのエラー シナリオを検討しようとしています。手順は次のとおり
です。 1. 2. を使用して Soundcloud 接続を開始しますSC.connect(my_callback_fn)
。ポップアップ ウィンドウが開き、ユーザーにアプリ認証の「接続」または「キャンセル」を要求する aound-Cloud ページが表示されます。
3. ユーザーが「キャンセル」をクリックします。(ここで私は立ち往生しています)

ユーザーがキャンセルをクリックすると、window.opener (親ページ) の SDK から JavaScript エラーが表示されます。もっと丁寧に扱ってほしい。
現在、エラー文字列をキャッチして適切に処理するためのイベント ハンドラーを使用しwindow.onerrorています。このメソッドは他のすべての js エラーに対しても呼び出されるため、このエラーを処理するより良い方法を探していました。ありがとう。

次の 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

4

1 に答える 1

2

少し汚れていますが、例外をキャッチする最速の方法は、ダイアログのコールバックを上書きすることです。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のプロパティにアクセスしようとして例外が発生した場合でも、ウィンドウは開いたままです。

注: SoundCloud からのエラーをキャッチする別の方法は、callback.html (SoundCloud コールバック URL) を直接変更することです。これは、の内容paramsが最初にクエリ文字列としてコールバック URL に渡され、単純に別のコールバック (onload 関数内)

于 2013-11-22T06:42:28.070 に答える