【发布时间】:2018-03-26 00:37:46
【问题描述】:
这需要一些设置让您了解我想要做什么。它涉及模板和异步调用。我知道异步调用的复杂性和细微差别。
我有一段 javascript,在一个 .js 文件中。该脚本包含一些需要用实际变量替换的“标签”,这些标签在每次使用时都不同。您会注意到脚本中嵌入了“{{tags}}”。您还会注意到该脚本包含对 C# 通用处理程序的 ajax 调用。 :
// this is template code from LoadFlights.js, called from LoadFlights() in main.js...
$.ajax({
type: "POST",
url: "js/handlers/LoadFlights.ashx",
dataType: "text",
cache: false,
data: {
DateStart: "{{DATESTART}}",
DateEnd: "{{DATEEND}}",
Specific: JSON.stringify({DAY: "{{DAY}}", DEP: "{{DEP}}", CARRIER: "{{CARRIER}}", FLT: "{{FLT}}", LEGCD: "{{LEGCD}}"})
},
success: function (result) {
callback_LoadFlights(result);
},
error: function (result) {
alert(result.responseText);
return false;
}
});
function callback_LoadFlights(result) {
alert(result);
}
// end
我通过 jquery .get() 调用获取脚本,并在 .done() 回调中尝试将检索到的脚本代码分配给变量。
function runScript(source, parameters) {
if (URLExists(source)) {
var getScript = $.get({
url: source,
dataType: "script"
})
.done(function (scriptCode) {
var code = scriptCode;
// replace any passed parameters...
for (var p in parameters) {
code = code.replace("{{" + p + "}}", parameters[p]);
}
// remove any unused parameter placeholders...
while (code.indexOf("{{") >= 0) {
code = code.substr(0, code.indexOf("{{")) + code.substr(code.indexOf("}}") + 2);
}
var s = document.createElement('script');
s.type = "text/javascript";
s.text = code;
document.body.appendChild(s);
})
.fail(function () {
alert("Failed to retrieve script: " + source);
})
}
(为简洁起见,我省略了else。)
在这条线上会发生什么:
var code = scriptCode;
代码立即执行,Generic Handler 调用触发,并立即以“无效的日期格式”(尝试使用 DateStart 的第一行)失败,因为 DateStart 仍然等于“{{DATESTART}}”。 没有执行替换标记的代码。
即使我在该行设置断点并尝试单步执行 INTO 以查看可能发生的情况,它仍会立即触发通用处理程序调用。
在调试器中,我typeof'd 即时窗口中的 code 和 scriptCode,都返回“string”。
我很想相信某种 JavaScript 错误正在发生,立即杀死 JavaScript 代码块并停止它的执行。
但是通用处理程序是如何被解雇的呢?从表面上看,.get().done() 检索到的 javascript 似乎是通过简单地将其分配给另一个变量来执行的。这甚至可能吗?谁能看到这里出了什么问题?
【问题讨论】:
标签: javascript jquery ajax asynchronous