使用jQuery的标准AJAX查询:
var globalTitle = "";
var pages = ["a", "b", "c"];
for (var i = 0; i < pages.length; i++) {
createpage(pages[i]);
}
function createpage(title) {
globalTitle=title;
console.log (globalTitle); //All looks good here
$.ajax({
url: "createpage.php?id=" + title,
context: document.body,
success: success
});
}
success()函数使用globaltitle,这就是我必须将其声明为全局的原因。
在success()函数中虽然是console.log(globalTitle);不断给我“一个”。这就像分配了变量,但每次调用success()时都会被缓存。
发生在FF 4和Chrome 8中。有什么想法吗?
编辑:这是success()函数:
function success(text) {
console.log (globalTitle); // always "a"
var div1 = "<div id=\"" + globalTitle + "\">";
var text = "<a href=\"javascript:createpage('" + globalTitle + "')\">Retry</a> " + +text;
var div2 = "</div>";
if ($("#" + globalTitle).length) {
$("#" + globalTitle).html(text);
} else {
$("#ajax").append(div1+text+div2);
}
}
答案 0 :(得分:1)
我会做这样的事情(var xhr =
和xhr.cpTitle
位是这项工作的关键)。这是因为每次请求页面时都会覆盖globalTitle
(在收到任何响应之前都会被覆盖),因此它总是具有最后请求的值:
function createpage(title) {
console.log(title);
var xhr = $.ajax({
method: "post",
url: "createpage.php",
data: {
id: title
},
context: document.body,
success: success
});
xhr.cpTitle = title;
}
function success(data, status, xhr) {
console.log(xhr.cpTitle);
}
或者这个(请注意success()
createpage()
内的,通过创建闭包以另一种方式避免此问题:
function createpage(title) {
function success(data, status, xhr) {
console.log(title);
}
console.log(title);
$.ajax({
method: "post",
url: "createpage.php",
data: {
id: title
},
context: document.body,
success: success
});
}
答案 1 :(得分:1)
问题在于同步调用createpage,但是将异步调用success函数,因此无法保证成功运行时将设置globaltitle。尝试将globaltitle global设置为createpage而不是整个脚本。
function createpage(title) {
$.ajax({
url: "createpage.php?id=" + title,
context: document.body,
success: function(data) {
console.log(title);
//you could call your success function here and pass it title
success(title);
}
});
}