gpt4 book ai didi

jQuery:如何在 $.ajax() 中访问全局变量

转载 作者:行者123 更新时间:2023-12-01 01:04:03 26 4
gpt4 key购买 nike

Possible Duplicate:
Can't access global variable in jQuery $.get within function

这可能是一个新手问题,但事情是这样的:我声明了一个名为 Preview 的全局变量。通过 AJAX,我得到一个 json 数组并循环遍历它。对于每次迭代,我都会执行另一个 AJAX 调用来获取字符串并将其附加到全局变量。

但是,在第二次 AJAX 调用后打印全局变量会给出“空字符串”(我肯定会从第二次 AJAX 调用中返回一个字符串)。

代码如下:

var preview;
$("#some-button").click(function(e){
e.preventDefault();
var companies = "blahblahblah";

$.ajax({
url: "tracklink/getemails.php",
type: "POST",
data: "companies=" + companies,
dataType: "json",
success: function(databack) {
if (databack) {
for (i=0; i<databack.length; i=i+1) {
preview = "";
$("#selected-clip-list li").each(function(){
$.ajax({
url: "tracklink/cksum.php",
type: "POST",
data: "video_id=" + $(this).attr("clip_id") + "&addr=" + databack[i].email_address,
success: function (msg) {
if (msg) {
preview += msg;
}
//this works
//console.log(preview);
}
});
});
//doesn't work
console.log(preview);
}
}
}
});
});

知道为什么我得到“空字符串”吗?

非常感谢。

最佳答案

因为 Ajax 是异步的。这一行:

//doesn't work
console.log(preview);

在处理响应之前执行。这就是您提供回调函数 (success:) 来处理响应的原因。

所有处理响应的代码都必须位于回调内部或从回调中调用。

这与回调中无法访问预览无关(因为它是可访问的)。

更新:您可以使用 Deferred objects 解决此问题:

success: function(databack) {
if (databack && databack.length > 0) {
var deferred = $.Deferred();

preview = "";
for (i=0; i<databack.length; i=i+1) {
$("#selected-clip-list li").each(function(){
deferred = deferred.pipe($.ajax({...}));
});
}
deferred.then(function() {
console.log(preview);
});
}
}

这将按顺序执行 Ajax 请求(但非阻塞),以便将响应以正确的顺序附加到 preview 中。但实际上我并不是 100% 清楚你想在预览中收集哪些数据。你确定这个嵌套的 for 循环是正确的吗?

如果你不关心Ajax请求的顺序,你也可以这样做:

var deferreds = [];
for (i=0; i<databack.length; i=i+1) {
$("#selected-clip-list li").each(function(){
deferreds.push($.ajax({...}));
});
}
$.when.apply($, deferreds).then(function() {
console.log(preview);
});

关于jQuery:如何在 $.ajax() 中访问全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6967654/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com