在使用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"但结果相同。
答案 0 :(得分:0)
这是异步的东西:)在执行load_source(url)
和sum()
函数之前,无法完成资源提取(mul()
)。
您想要成功加载远程资源的东西应该放在回调中,该回调在成功获取资源后执行。
<强>更新强>
$.ajax()
函数范围,而不适用于is_empty
父函数。 答案 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;