从外部脚本中的函数捕获错误
Catch error from function within external script
我正在使用 Soundcloud API,但这个问题是关于捕获一般错误的。
我尝试加载一首曲目,但由于某些特定于该曲目的设置或限制,我得到了 403 (Forbidden)
响应。我在 <head>
:
中加载的 soundcloud 脚本中抛出此错误
<script src="https://connect.soundcloud.com/sdk/sdk-3.1.2.js"></script>
稍后,在我的客户端javascript:
SC.initialize({
client_id: 'xxxx',
});
...
SC.resolve(`https://soundcloud.com/${trackUrl}`).then((response) => {
this.track.setAttribute('src', `${response.stream_url}?client_id=xxxx`);
});
trackURL 是有效的 URL - 它是轨道的 'readable' url,它 是 解析为正确的轨道 ID,我可以在下面的 GET 请求错误中看到:
在控制台中:
api.js:26 GET https://api.soundcloud.com/tracks/276705791.json?client_id=20f6b95488a0ca8f2254e250e6b0b229 403 (Forbidden)
inspecting api.js:
const sendRequest = (method, url, data, progress) => {
let xhr;
const requestPromise = new Promise((resolve) => {
const isFormData = global.FormData && (data instanceof FormData);
xhr = new XMLHttpRequest();
if (xhr.upload) {
xhr.upload.addEventListener('progress', progress);
}
xhr.open(method, url, true);
if (!isFormData) {
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
}
xhr.onreadystatechange = () => {
if (xhr.readyState === 4) {
resolve({responseText: xhr.responseText, request: xhr});
}
};
xhr.send(data); // <-- LINE 26
});
requestPromise.request = xhr;
return requestPromise;
};
由于我是从外部加载这个脚本,所以我不能大惊小怪。
有没有什么方法可以在我自己的 javascript 中观察错误,以便我可以准备回退?
更新
下面 Joseph 的回答正是我所需要的——寻找 resolve
承诺中的错误。 Soundcloud 对响应消息的帮助不大,但我现在可以编写后备程序。更新代码:
SC.resolve('https://soundcloud.com/jacquesgreene/you-cant-deny').then((response) => {
this.track.setAttribute('src', `${response.stream_url}?client_id=20f6b95488a0ca8f2254e250e6b0b229`);
this.element.addClass('ready');
}, (error) => {
myFallback();
});
最简单的答案是查阅文档。
现在这是XHR,它是异步的。你不能 "catch" 与你的常规 try-catch
.
然而,xhr 操作只检查 readyState 4。意味着 xhr 完成而不管 HTTP 状态,甚至 403,并且只用数据 (responseText
) 和 xhr 对象本身解决承诺(xhr
)。现在的问题是,如果已解决的值返回到您的 SC.resolve
调用。
从这里开始,一切都是胡乱猜测(除非您再次查阅文档)。您可以检查回调中的 response
是什么,或者尝试在您的调用中添加拒绝回调希望 API 将其正确映射为失败。
SC.resolve(`https://soundcloud.com/${trackUrl}`).then((response) => {
// What is `response` and what does it contain?
}, function(error){
// Does this execute? If so, what is `arguments`.
});
我正在使用 Soundcloud API,但这个问题是关于捕获一般错误的。
我尝试加载一首曲目,但由于某些特定于该曲目的设置或限制,我得到了 403 (Forbidden)
响应。我在 <head>
:
<script src="https://connect.soundcloud.com/sdk/sdk-3.1.2.js"></script>
稍后,在我的客户端javascript:
SC.initialize({
client_id: 'xxxx',
});
...
SC.resolve(`https://soundcloud.com/${trackUrl}`).then((response) => {
this.track.setAttribute('src', `${response.stream_url}?client_id=xxxx`);
});
trackURL 是有效的 URL - 它是轨道的 'readable' url,它 是 解析为正确的轨道 ID,我可以在下面的 GET 请求错误中看到:
在控制台中:
api.js:26 GET https://api.soundcloud.com/tracks/276705791.json?client_id=20f6b95488a0ca8f2254e250e6b0b229 403 (Forbidden)
inspecting api.js:
const sendRequest = (method, url, data, progress) => {
let xhr;
const requestPromise = new Promise((resolve) => {
const isFormData = global.FormData && (data instanceof FormData);
xhr = new XMLHttpRequest();
if (xhr.upload) {
xhr.upload.addEventListener('progress', progress);
}
xhr.open(method, url, true);
if (!isFormData) {
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
}
xhr.onreadystatechange = () => {
if (xhr.readyState === 4) {
resolve({responseText: xhr.responseText, request: xhr});
}
};
xhr.send(data); // <-- LINE 26
});
requestPromise.request = xhr;
return requestPromise;
};
由于我是从外部加载这个脚本,所以我不能大惊小怪。
有没有什么方法可以在我自己的 javascript 中观察错误,以便我可以准备回退?
更新
下面 Joseph 的回答正是我所需要的——寻找 resolve
承诺中的错误。 Soundcloud 对响应消息的帮助不大,但我现在可以编写后备程序。更新代码:
SC.resolve('https://soundcloud.com/jacquesgreene/you-cant-deny').then((response) => {
this.track.setAttribute('src', `${response.stream_url}?client_id=20f6b95488a0ca8f2254e250e6b0b229`);
this.element.addClass('ready');
}, (error) => {
myFallback();
});
最简单的答案是查阅文档。
现在这是XHR,它是异步的。你不能 "catch" 与你的常规 try-catch
.
然而,xhr 操作只检查 readyState 4。意味着 xhr 完成而不管 HTTP 状态,甚至 403,并且只用数据 (responseText
) 和 xhr 对象本身解决承诺(xhr
)。现在的问题是,如果已解决的值返回到您的 SC.resolve
调用。
从这里开始,一切都是胡乱猜测(除非您再次查阅文档)。您可以检查回调中的 response
是什么,或者尝试在您的调用中添加拒绝回调希望 API 将其正确映射为失败。
SC.resolve(`https://soundcloud.com/${trackUrl}`).then((response) => {
// What is `response` and what does it contain?
}, function(error){
// Does this execute? If so, what is `arguments`.
});