从外部脚本中的函数捕获错误

Catch error from function within external script

本文关键字:错误 函数 脚本 从外部      更新时间:2023-09-26

我正在使用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 -它是轨道的'可读' 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,所以我可以准备一个回退?

约瑟夫下面的回答是我需要的-寻找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,它是异步的。你不能用你的常规try-catch "catch"。

但是,xhr操作只检查readyState 4。意味着无论HTTP状态如何(甚至是403),xhr都已完成,并且只解析带有数据(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`.
});