2016-07-08 2 views
-1

Я просто замечаю странное поведение при динамической загрузке скриптов с помощью AJAX. У меня умышленно есть код с ошибкой, который выдает ошибку при анализе. Хотя консоль Chrome действительно показывает ошибку, обработчик ошибок AJAX никогда не вызывается.AJAX без проблем при загрузке скрипта

Это функция, которую я использую для загрузки файлов:

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)); 
    } 
} 

Единственная переменная при условии, функции load_source является «путь», значение которого является строка с адресом и именем такой файл: "js/myFile.js".

Неправильно написанная часть (часть с опечаткой) сценария для загрузки заключается в следующей:

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, он показывает ошибку:

неперехваченного SyntaxError: Неожиданный токен, если

Пока единственный способ поймать ошибку - это событие onerror окна.

Так что, если это единственный способ поймать ошибку, не могли бы вы сказать мне, как остановить «кодирование» поток, я имею в виду, когда я называю 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

Событие сбоя запускается, это просто не останавливает работу остальных JS.Вы бы лучше делать некоторые вещи, как это:

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

Затем снимаете throw в вашей load_source() функции и используя 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, я редактировал код для этого: если (не удалось) { певд Error ('Невозможно загрузить файл JS {0}: {1}' формат (путь, не удалось).); ) и даже если консоль показывает ошибку, обработчик «fail» никогда не запускается (переменной «fail» присваивается значение в обработчике «fail»). Кроме того, не получите то, что вы имеете в виду * Затем удалите свой 'throw' в своей функции' load_source() 'и используйте 11return submit;' * – DanielYoshua

+0

Я также изменяю fail ($ .Deferred) для «ошибки» AJAX объект, но ошибка никогда не попадает. – DanielYoshua

+0

Взгляните на изменения, которые я сделал. – imtheman

Смежные вопросы