我正在尝试在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
答案 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函数中)