加载脚本时,AJAX无声地失败

时间:2016-07-08 20:45:14

标签: javascript jquery ajax

在使用AJAX动态加载脚本时,我注意到一种奇怪的行为。 我故意有一个拼写错误的代码,在解析时会抛出错误。即使Chrome的控制台确实显示错误,也永远不会调用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函数的唯一变量是" path" ,该值是一个包含此类文件的位置和名称的字符串:" 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:如果

,则出现意外的令牌

到目前为止,我可以捕获错误的唯一方法是使用窗口的错误事件。

所以,如果这是捕捉错误的唯一方法,你能否告诉我如何停止编码" flow,我的意思是,每当我调用 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);
// ...

你们能告诉我如何触发失败事件吗?

我也试过" (文档)$ .ajaxError"但结果相同。

2 个答案:

答案 0 :(得分:0)

这是异步的东西:)在执行load_source(url)sum()函数之前,无法完成资源提取(mul())。

您想要成功加载远程资源的东西应该放在回调中,该回调在成功获取资源后执行。

<强>更新

  • 关于你的例子中的“aysnc:false”,并提到了 注释:这仅适用于$.ajax()函数范围,而不适用于is_empty 父函数。
  • 另外:{{1}}不是标准的一部分 库,我假设你已经在其他地方定义了这个功能?

答案 1 :(得分:-1)

正在触发失败事件,它不会阻止JS的其余部分运行。你做这样的事情会更好:

SmallObject so(1, 4.2);
A a(so, -1);

然后移除if(load_source('js/myFile.js')) { sum(4, 3); mul(5, 5); } 功能中的throw并使用load_source(),如下所示:

return success;