Javascript 使用jQuery getJSON并在处理结果后启动函数。。。应该有用。。。但是';T

Javascript 使用jQuery getJSON并在处理结果后启动函数。。。应该有用。。。但是';T,javascript,function,getjson,jquery,Javascript,Function,Getjson,Jquery,我有一系列函数,它们填充了一系列下拉框 这是一个产品数据页,用于添加新项目或编辑现有项目。在后一种情况下,一旦填充了所有下拉框,它将从数据库中获取一个项目数据作为JSON字符串,并使用$('#elem').val('value') 这一切都很好,只是我不能把事情按正确的顺序进行 1. function loadBrands() { 2. $('#brand').empty().append('<option value="">Select...</option>

我有一系列函数,它们填充了一系列下拉框

这是一个产品数据页,用于添加新项目或编辑现有项目。在后一种情况下,一旦填充了所有下拉框,它将从数据库中获取一个项目数据作为JSON字符串,并使用
$('#elem').val('value')

这一切都很好,只是我不能把事情按正确的顺序进行

1.  function loadBrands() {
2.     $('#brand').empty().append('<option value="">Select...</option>').addClass('centreLoader');
3.     $.getJSON('/jsonData/brands.txt', function (data) {
4.         $.each(data, function (i, item) {
5.             $('#brand').append('<option value="' + data[i].label + '">' + data[i].brandName+ '</option>');
6.         });
7.         $('#brand').removeClass('centreLoader');
8.         loadSavedItem(); 
9.     });
10. };
同样,非常简单,第2行获取JSON输出(同样有效,它可以很好地填充其他字段),并将字段值设置为适用的值(这显然是代码的缩短版本)

问题似乎是在
#brands
完全填充之前,调用
loadSavedItem()
太快,因此无法正确设置值。如果我加上一个延时,它就会起作用

但是。。。我认为
$(每个…
jQuery语句)之后的任何事情都不应该在
$(每个)
完成之前发生

我怎样才能确保情况是这样的呢?

根据我的经验,如果有意义的话,在脚本的其余部分运行时,$(每个)可以循环(至少在Chrome中)。也许这与“优化”有关

我以前通过检查
data.length
,设置一个递增1的计数器,然后在计数器等于长度时关闭代码,解决了这个问题

function loadBrands() {
    $('#brand').empty().append('<option value="">Select...</option>').addClass('centreLoader');
    $.getJSON('/jsonData/brands.txt', function (data) {
        var dataNum = data.length;
        var counter = 1;
        $.each(data, function (i, item) {
            $('#brand').append('<option value="' + data[i].label + '">' + data[i].brandName+ '</option>');
            if (dataNum == counter) {
                $('#brand').removeClass('centreLoader');
                loadSavedItem(); 
            }
            counter ++;
        });
    });
}
函数loadBrands(){
$('#brand').empty().append('Select…').addClass('centreLoader');
$.getJSON('/jsonData/brands.txt',函数(数据){
var dataNum=data.length;
var计数器=1;
$。每个(数据、功能(i、项){
$('#brand').append(''+数据[i].brandName+'');
if(dataNum==计数器){
$(“#品牌”).removeClass('centreLoader');
loadSavedItem();
}
计数器++;
});
});
}
根据我的经验,$(每个)可以在脚本的其余部分运行时循环,如果这有意义的话(至少在Chrome中)。也许这与“优化”有关

我以前通过检查
data.length
,设置一个递增1的计数器,然后在计数器等于长度时关闭代码,解决了这个问题

function loadBrands() {
    $('#brand').empty().append('<option value="">Select...</option>').addClass('centreLoader');
    $.getJSON('/jsonData/brands.txt', function (data) {
        var dataNum = data.length;
        var counter = 1;
        $.each(data, function (i, item) {
            $('#brand').append('<option value="' + data[i].label + '">' + data[i].brandName+ '</option>');
            if (dataNum == counter) {
                $('#brand').removeClass('centreLoader');
                loadSavedItem(); 
            }
            counter ++;
        });
    });
}
函数loadBrands(){
$('#brand').empty().append('Select…').addClass('centreLoader');
$.getJSON('/jsonData/brands.txt',函数(数据){
var dataNum=data.length;
var计数器=1;
$。每个(数据、功能(i、项){
$('#brand').append(''+数据[i].brandName+'');
if(dataNum==计数器){
$(“#品牌”).removeClass('centreLoader');
loadSavedItem();
}
计数器++;
});
});
}

我的建议是在Success函数中添加方法“loadSavedItem()”,如下所示。这应该可以解决问题

$.ajax({   
   url: url,   
   dataType: 'json',   
   async: true,   
   data: myData,   
   success: function(data) {     // loadSavedItem();   } 
});

希望这有帮助!!

我的建议是在成功函数中添加“loadSavedItem()”方法,如下所示。这应该可以解决问题

$.ajax({   
   url: url,   
   dataType: 'json',   
   async: true,   
   data: myData,   
   success: function(data) {     // loadSavedItem();   } 
});

希望这有帮助!!

我相信线索是
jQuery.ajax()的
async
设置。
我相信线索是
jQuery.ajax()的
async
设置。
label
brandName
是您的值/显示属性吗?然后在您的第二个请求中,您使用
brand
来设置您的值-我猜这对应于
label
,因为您说这在短时间延迟后有效。是的,这是正确的。每个JSON调用中的数据源都不同,因此标签名称也是,但是是的,在示例1中,下拉列表中填充了一个
标签
值,第二个示例的输出将
品牌
作为要选择的值。
标签
品牌
是您的值/显示属性吗?然后在第二个请求中,您使用
品牌
来设置您的值-我猜是this对应于
label
,因为您说它在短时间延迟后才能工作。是的,这是正确的。每个JSON调用中的数据源都不同,因此标签名称也不同,但是是的,在示例1中,下拉列表填充了
label
值,第二个示例的输出将
brand
作为选择。这就是他正在做的-
getJSON
只在返回数据时运行函数。是的,getJSON的返回不是问题,它在等待
$(每个..
完成…我认为@Grim的想法就是答案。我会尝试…这就是他正在做的-
getJSON
只在返回数据时运行函数。是的,getJSON的返回不是问题,它在等待
$(每个..
都要完成…我想@Grim的想法就是答案。我会尝试…真的吗?好的,我在网上读到的所有东西都说应该等到完成后再处理下一个命令,但是,我得到的结果表明你是对的。我会尝试添加一个计数器。你会建议在循环中使用
if
语句触发他在
counter==data.length
时起作用,我猜?是的-我在回答中编辑了一些代码,以帮助将来访问此页面的人。我同意-JS应该是单线程的,但情况似乎并非总是如此。哦!你添加了一个示例!非常好?好吧,我在网上读到的所有内容都表明它是单线程的应该等到下一个命令完成后再处理,但是,我得到的结果表明你是对的。我会尝试添加一个计数器。你会在循环中建议一个
if
语句,当
counter==data.length
我假设?是的-我在回答中编辑了一些代码,以帮助访问它的人这是未来的一页,而我是