2

我正在尝试考虑 soundcloud 的 javscript 连接 oauth2 流中的错误场景。以下是步骤:
1. 使用启动 Soundcloud 连接SC.connect(my_callback_fn)
2. 打开一个弹出窗口,其中包含一个 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);
};

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

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

于 2013-11-22T06:42:28.070 回答