2016-07-08 3 views
-1

AJAXでスクリプトを動的に読み込むと、奇妙な動作に気付くだけです。 私は意図的に、それが解析されたときにエラーをスローするスペルの間違いがあるコードを持っています。 Chromeのコンソールに実際にエラーが表示されても、AJAXフェールハンドラは決して呼び出されません。スクリプトを読み込んだときにAJAXが黙って失敗する

これは私がファイルをロードするために使用する機能です:load_source機能に提供

var load_source = function (path) { 
    /* Variable used to determine whether the request was successful */ 
    var success = false, 
     failed; 

    $.ajax(
     { 
      url: path, 
      async: false, 
      dataType: 'script', 
      method: 'GET' 
     } 
    ). 
     done(function() { 
      success = true; 
     }). 
     fail(function (xhr, status, error) { 
      failed = error.stack ? error.stack : error; 
     }); 

    if (failed) 
    { 
     throw new Error('Unable to load JS file {0}: {1}'.format(path, failed)); 
    } 
} 

唯一の変数は、このようなAの場所と名前を持つ文字列である値、「パス」ですファイル: "js/myFile.js"。

キャッチされないでSyntaxError:

var f = function (arg) { 
    var param1 = 3, 
     param2, /* NOTICE the typo: there is a comma instead of a semicolon */ 

    if (param1 > arg) 
    { 
     return true; 
    } 
    // And more code is coming next... 

私はChromeのコンソールを見れば、それはエラーを示していますロードするスクリプトの

スペルミスの一部(タイプミスとの一部)はこれです:予期しないトークンがある場合

これまでのところ、エラーを検出できる唯一の方法は、ウィンドウのエラーイベントです。

これがエラーを捕まえる唯一の方法であれば、「コーディング」フローを停止する方法を教えてください。load_sourceはエラーをスローします(これはウィンドウの機能ONERROR )私は、スクリプトが他に何もしないようにしたい:

load_source('js/myFile.js'); // This script will throw the "Uncaught SyntaxError: Unexpected token if" error. 
// So I don't want the following code to be executed. 
sum(4, 3); 
mul(5, 5); 
// ... 

あなたたちはどのようにトリガすることができないイベントを行い教えてもらえますか?

私は "$(document).ajaxError"でも同じ結果を試しました。

+0

可能性のある重複したあなたは、このようないくつかのことをやったほうが良いと思いますJavascriptの実行を停止するJavascript?](http://stackoverflow.com/questions/9431434/can-i-throw-an-exception-in-javascript-that-stops-javascript-execution) – imtheman

+0

'async:false'と'dataType: 'script'は混在しません。このリクエストは

-1

failイベントが発生していますが、JSの残りの部分が実行されていないことを示しています。

if(load_source('js/myFile.js')) 
{ 
    sum(4, 3); 
    mul(5, 5); 
} 

次に、あなたのload_source()機能であなたのthrowを削除し、そのように、return success;を使用して::[私は例外を投げることができるの

var load_source = function (path) { 
    /* Variable used to determine whether the request was successful */ 
    var success = false; 

    $.ajax(
     { 
      url: path, 
      async: false, 
      dataType: 'script', 
      method: 'GET', 
      success: function(){ 
       success = true; 
      }, 
      error: function (xhr, status, error) { 
       console.log(error.stack ? error.stack : error); 
      } 
     } 
    ); 

    return success; 
} 
+0

こんにちは@imtheman、 私はこのコードを編集しました } また、コンソールにエラーが表示されても、「失敗」ハンドラはトリガされません(「失敗」変数には「失敗」ハンドラの値が割り当てられます)。 また、あなたが 'load_source()'関数で 'throw 'を取り除いて11return submit;を使用しても意味がありません。* – DanielYoshua

+0

「エラー」AJAXの失敗($ .Deferred)オブジェクトのプロパティは、エラーは決してキャッチされません。 – DanielYoshua

+0

私が行った変更を見てください。 – imtheman

関連する問題