何らかの理由で、このコードはキャッチされない例外エラーを返します。 catchブロックがエラーをキャッチしていないようです。 catchブロックのスコープは、ネストされた関数でエラーをスローできないようにスコープされ、チェーンの上位にスコープされたcatchステートメントによってキャッチされることを期待していますか?私が作業しているアプリケーションの機密データの一部は削除されましたが、leadInfo [0/1]はURLパラメーターから取得した32文字の英数字の文字列であると予想されていました。
ここでの根本的な問題は、APIからエラーを返すmy AJAX呼び出しと、そのエラーがアプリケーション内で適切に処理されないことです。したがって、throwステートメントが必要です。AJAX呼び出しは正常に完了し、プロパティとしてメールアドレスを含まないJSONオブジェクトを返すため、ページを変更してそれを反映するように処理する必要があります。
jQuery(document).ready(function(){
try {
url = "http://api.com/api/v1/lead/" + leadInfo[1]
jQuery.ajax({
type: 'GET',
contentType: 'application/json',
url: url,
dataType : 'jsonp',
success: function (result) {
result = jQuery.parseJSON(result);
if(!result.data.email){
throw ('New exception');
}
console.log(result);
jQuery('.email').html(result.data.email);
}
});
jQuery('.surveryButton').click(function(){
window.location.replace("http://" + pgInventory.Host + pgInventory.path + leadInfo[0] + "&curLeadId=" + leadInfo[1] + "&curViewedPages=0");
});
}
catch(err) {
jQuery('.email').html('your e-mail address');
jQuery('#arrowContent').remove();
}
});
try catch
ブロックが失敗する理由は、ajaxリクエストが非同期であるためです。 try catchブロックはAjax呼び出しの前に実行され、リクエスト自体を送信しますが、結果が返されるとエラーがスローされますAT A LATER POINT IN TIME。
try catch
ブロックが実行されるとき、エラーはありません。エラーがスローされた場合、try catch
はありません。 Ajaxリクエストにtry catch
が必要な場合は、常にsuccess
コールバック内にajax try catch
ブロックを配置してください。
方法は次のとおりです。
success: function (result) {
try {
result = jQuery.parseJSON(result);
if (!result.data.email) {
throw ('New exception');
}
console.log(result);
jQuery('.email').html(result.data.email);
} catch (exception) {
console.error("bla");
};
}
問題は、ajaxが定義上非同期であることです。例外は_$.ajax
_関数内からスローされるのではなく、成功時にcallback関数からスローされます(後でトリガーされます)。
サーバー応答エラーを処理するために、error: function(data) {}
パラメーターも指定する必要があり、さらにtry/catchブロックを配置する必要がありますinsideコールバック関数。
本当にコールバックの外側でキャッチしたい場合は、例外をスローするのではなく、関数の呼び出しを検討する必要があります。どのようにすればよいかわかりません。
Javascriptのコールバックメソッドは非同期であるため、エラーをスローする関数のコンテキストは元のものとは異なります。次の方法で行う必要があります。
success: function (result) {
try {
result = jQuery.parseJSON(result);
if(!result.data.email){
throw ('New exception');
}
console.log(result);
jQuery('.email').html(result.data.email);
}
catch(err) {
// Dealing with the error
}
}
この素晴らしい 記事 について(非常に特定の)contexts、closuresおよびJavascriptのbindings。