Javascript 无法访问AJAX成功之外的JSON对象

Javascript 无法访问AJAX成功之外的JSON对象,javascript,php,jquery,ajax,json,Javascript,Php,Jquery,Ajax,Json,我在使用AJAX成功范围之外的JSON对象时遇到问题。我需要在AJAX成功范围之外访问返回的JSON对象。但是,我尝试在AJAX范围之外初始化JS变量,并将JSON分配给它。但是,这种方法会导致catalog.item未定义错误。我感谢任何能帮助我解决这个问题的建议 这就是我所尝试的: 这种方法非常好(但不是我需要的): $('.catViewButton')。单击(函数(){ var overlay=jQuery(“”); 覆盖。附加到(“发票正文”); $('.catalog view wr

我在使用AJAX成功范围之外的JSON对象时遇到问题。我需要在AJAX成功范围之外访问返回的JSON对象。但是,我尝试在AJAX范围之外初始化JS变量,并将JSON分配给它。但是,这种方法会导致
catalog.item未定义
错误。我感谢任何能帮助我解决这个问题的建议

这就是我所尝试的:

这种方法非常好(但不是我需要的):

$('.catViewButton')。单击(函数(){
var overlay=jQuery(“”);
覆盖。附加到(“发票正文”);
$('.catalog view wrapper').show();
$.ajax({
url:“ajax/invoice get data.php?loadCatalog=1”,
数据类型:“json”,
成功:功能(目录){
警报(目录项[0]。图像);
$('.catalog img container').attr(“src”,catalog.item[0].image);
}
}); 
…更多代码
.....
.....
这种方法正是我所需要的,但会导致错误:

        var catalog = [];
        $('.catViewButton').click(function(){
            var overlay = jQuery('<div class="overlay"> </div>');
            overlay.appendTo(".invoice-body");
            $('.catalog-view-wrapper').show();
            $.ajax({
                url: "ajax/invoice-get-data.php?loadCatalog=1",
                dataType: "json",
                success: function(cat){
                    catalog = cat;
                }
            }); 
            alert(catalog.item[0].image);
            $('.catalog-img-container').attr("src", catalog.item[0].image);
                    ...more code
                    .....
                    .....
var目录=[];
$('.catViewButton')。单击(函数(){
var overlay=jQuery(“”);
覆盖。附加到(“发票正文”);
$('.catalog view wrapper').show();
$.ajax({
url:“ajax/invoice get data.php?loadCatalog=1”,
数据类型:“json”,
成功:功能(cat){
目录=cat;
}
}); 
警报(目录项[0]。图像);
$('.catalog img container').attr(“src”,catalog.item[0].image);
…更多代码
.....
.....

非常感谢!

这就是的
a
非常重要的地方。异步意味着
警报和随后的
.attr()
行在成功回调运行之前正在运行。您确实应该将这些行放在成功回调中。

这就是的
a
非常重要的地方。异步意味着
警报和随后的
.attr()
行在成功回调运行之前正在运行。您确实应该将这些行放在成功回调中。

您可以使用来处理异步调用。这样做,您的代码将按读取顺序执行,无论何时返回响应。您可以根据需要添加任意多个回调:

jqxhr = $.ajax({
    url: "ajax/invoice-get-data.php?loadCatalog=1",
    dataType: "json"
}); 
jqxhr.done(function(catalog) { 
    alert(catalog.item[0].image);
    $('.catalog-img-container').attr("src", catalog.item[0].image);
});
jqxhr.done(function(catalog) { 
    // use catalog again
});
文档中充满了所有这些方面的示例:。

您可以使用来处理异步调用。这样,无论何时返回响应,您的代码都将按读取顺序执行。您可以根据需要添加任意数量的回调:

jqxhr = $.ajax({
    url: "ajax/invoice-get-data.php?loadCatalog=1",
    dataType: "json"
}); 
jqxhr.done(function(catalog) { 
    alert(catalog.item[0].image);
    $('.catalog-img-container').attr("src", catalog.item[0].image);
});
jqxhr.done(function(catalog) { 
    // use catalog again
});

文档中充满了关于所有这些的示例:。

看看延迟obj和.when()。您不必将所有内容都放在成功回调中


查看延迟对象和.when()。您不必将所有内容都放在成功回调中


AJAX就是这样工作的。返回到
成功:
函数的结果是该函数的本地结果

如果需要在success函数之外访问它们,一个选项是将它们存储在元素中,例如隐藏的
字段,如下所示:

<input type="hidden" id="myHiddenField" />
假设有这样一个隐藏的输入字段:

<input type="hidden" id="myHiddenField" />
在AJAX功能之外:

$('#myHiddenField').blur(function() {
    var cat = $(this).val();
    //now do something with the data in var cat
});

AJAX就是这样工作的。返回到
success:
函数的结果是该函数的本地结果

如果需要在success函数之外访问它们,一个选项是将它们存储在元素中,例如隐藏的
字段,如下所示:

<input type="hidden" id="myHiddenField" />
假设有这样一个隐藏的输入字段:

<input type="hidden" id="myHiddenField" />
在AJAX功能之外:

$('#myHiddenField').blur(function() {
    var cat = $(this).val();
    //now do something with the data in var cat
});

不是重复的。程序员需要理解使用jquery进行异步调用和同步调用之间的区别ajax@JamesMontagne-Felix肯定在这方面获得了很多流量。@AkshayKhandelwal-它是“异步Javascript和XML”的缩写有一个原因!这就是为什么同步是个坏主意的一个例子。试着在输入中键入你的名字。它不是很流畅/令人愉快吗?答案很长吗?是的。答案很复杂吗?可能。它回答了你的问题吗?当然。因此,阅读这个长答案对于理解为什么你在第一阶段遇到问题至关重要e、 不是重复的。程序员需要理解使用jquery进行异步调用和同步调用之间的区别ajax@JamesMontagne-Felix肯定在这方面获得了很多流量。@AkshayKhandelwal-它是“异步Javascript和XML”的缩写有一个原因!这就是为什么同步是个坏主意的一个例子。试着在输入中键入你的名字。它不是很流畅/令人愉快吗?答案很长吗?是的。答案很复杂吗?可能。它回答了你的问题吗?当然。因此,阅读这个长答案对于理解为什么你在第一阶段遇到问题至关重要e、 谢谢你的回复。但是如果我需要在成功回调之外使用JSON对象的内容呢?有办法吗?@AnchovyLegend那么你仍然必须等到成功回调执行之后。没有办法。你的代码不一定要在成功回调内,但它需要在成功回调中通过成功回调或在成功回调之后执行的函数。@AnchovyLegend是的,有一种方法可以解决这个问题:看我的答案。正如一些纯粹主义者所指出的,这是一个难题,但它是有效的。(这是否适合你取决于你的网络应用收到的流量。不是每个网络应用都是谷歌邮件……我一直在使用这种方法,就像其他教我的人一样。)T