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

标签 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 是一个有效的 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 中的错误 promise 。 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 来“捕获”。

但是,xhr 操作仅检查readyState 4。这意味着 xhr 已完成,无论 HTTP 状态如何,甚至是 403,并且仅使用数据(responseText)和 xhr 对象解析 promise 本身(xhr)。现在的问题是,解析后的值是否返回到您的 SC.resolve 调用。

从这里开始,这都是一个疯狂的猜测(除非您再次查阅文档)。您可以检查回调中的响应,或者尝试在调用中添加拒绝回调,希望 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`.
});

关于javascript - 从外部脚本中的函数捕获错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39176608/

相关文章:

javascript - 如何排除目录被 Webpack 捆绑?

python - Beautiful Soup 无法识别按钮标签

javascript - 访问 WebGL (two.js) 应用程序的 Soundcloud 波形/图稿 - CORS 问题

javascript - 在 JavaScript 中计算总数

css - 无法点击谷歌浏览器中的 soundcloud 小部件

javascript - 为什么我的程序会发出无休止的 GET 请求?

javascript - ng-repeat 重复,但为空

javascript - 简单的拖放实现

javascript - JavaScript 中 "decorator function"和 "decorator design pattern"有什么区别?

javascript - 如何计算 AngularJS 中选中的复选框的数量?