如何处理soundcloud oauth2错误

时间:2013-09-09 16:33:29

标签: soundcloud

我正在尝试在soundcloud的javscript连接oauth2流程中考虑错误情况。以下是步骤:
1.使用SC.connect(my_callback_fn)发起Soundcloud连接 2.弹出一个弹出窗口,其中有一个响亮的云页面,要求用户“连接”或“取消”应用认证 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

1 个答案:

答案 0 :(得分: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);
};

此外,您可以定期在对话框对象上设置计时器,以检查用户是否关闭它,而不单击“连接”或“取消”。您不能使用onunload,因为浏览器不允许您在具有不同域的窗口上设置任何属性(在本例中为SoundCloud)。这意味着 - 如果您尝试访问任何dialog.options.window的属性时出现异常 - 窗口仍然打开。

注意:另一种捕获来自SoundCloud的错误的方法是直接修改你的callback.html(SoundCloud回调网址),因为params的内容首先作为查询字符串传递给你的回调网址,你可以检查它们只是调用一个不同的回调(在onload函数中)