2016-08-27 40 views
0

我正在使用Soundcloud API,但是這個問題是關於捕捉一般錯誤的。從外部腳本中的函數捕獲錯誤

我嘗試加載一個曲目,並且由於某些特定於該曲目的設置或限制,會得到一個403 (Forbidden)響應。

<script src="https://connect.soundcloud.com/sdk/sdk-3.1.2.js"></script>

後來,在我的客戶端JavaScript:這個錯誤是我加載在我<head>的SoundCloud的腳本中拋出

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 - 這是該曲目的'可讀'網址,它的解析爲正確的曲目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

最簡單的答案是查閱文檔。

現在這是XHR,它是異步的。你不能「捕捉」你的常規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`. 
}); 
+0

謝謝約瑟夫,看看我上面的更新。將'error'記錄到控制檯並沒有給我太多的信息:'{message:「HTTP Error:403」,status:403}'但現在我可以繼續後退了。 –