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

时间:2016-08-27 01:25:05

标签: javascript soundcloud

我正在使用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 是一个有效的网址 - 它是“可读的”网址。轨道的网址, 解析为正确的轨道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();
    });

1 个答案:

答案 0 :(得分:1)

最简单的答案是查阅文档。

现在这是XHR,它是异步的。你不能抓住&#34;与您的常规try-catch

然而,xhr操作仅检查readyState 4.意味着xhr已完成,无论HTTP状态如何,甚至是403,只是使用数据(responseText)和xhr对象本身解析了promise({ {1}})。现在的问题是,如果已解决的值会回到xhr来电。

从这里开始,这是一个疯狂的猜测(除非您再次查阅文档)。您可以检查回调中SC.resolve的内容,也可以尝试在调用中添加拒绝回调,希望API将其正确映射为失败。

response