如何在ajax方法中将值设置为公共变量?

时间:2016-05-19 11:46:20

标签: jquery ajax

我尝试在ajax方法的外部使用ajax的结果并编写了这段代码,但得到的错误是:

TypeError: foods is null    

for (var j = 0; j <foods.obj.length; j++) {
$(document).ready(function () {
            var foods = null;
            $.ajax({
                url: '/Train/TrianFood',
                data: { Tarrif: 1 },
                type: "POST",
                context: this,
                success: function (result) {foods = result;},
                error: function () {}
            });
            var parentOfFood = $('#accordion1 .person-information');
            for (var i = 0; i < parentOfFood.length; i++) {
                var foodSelect = $(parentOfFood[i]).find('select[name$=Food]');

                for (var j = 0; j <foods.obj.length; j++) {

                    foodSelect.append(new Option(foods.obj[j].ServiceType, foods.obj[j].ServiceTypeCode));
                }
            }
       });

如何解决此问题?enter image description here

4 个答案:

答案 0 :(得分:1)

这是因为result = re.sub(r'(\d+)(?:\.(\d+))(\w).*', r"\1\3\2", test_str).upper() 正在执行ajax响应回调之前。 要解决此问题,请创建loop&amp;在ajax响应之后执行它。

尝试以下方式 -

function

答案 1 :(得分:1)

因为异步调用而发生。你的for循环在ajax成功调用之前运行,因此食物不包含任何信息。尝试在成功函数本身中编写代码。

$(document).ready(function () {
                    var foods = null;
                    $.ajax({
                        url: '/Train/TrianFood',
                        data: { Tarrif: 1 },
                        type: "POST",
                        context: this,
                        success: function (result) {foods = result;
                                  var parentOfFood = $('#accordion1 .person-information');
                                  for (var i = 0; i < parentOfFood.length; i++) {
                                  var foodSelect = $(parentOfFood[i]).find('select[name$=Food]');

                                  for (var j = 0; j <foods.obj.length; j++) {

                                      foodSelect.append(new Option(foods.obj[j].ServiceType, foods.obj[j].ServiceTypeCode));
                                  }
                                  }
                               }, 
                        error: function () {}
                    });

               });

另一种方法是在包含for循环的ajax成功调用中调用函数。

答案 2 :(得分:1)

问题涉及在为食物分配值之前运行异步函数的事实。这是一个问题,因为只有在请求成功时才能为食品分配价值。 无法知道需要多长时间或请求是否会成功。这是racing condition的经典情况。

这是您应该调整代码的方式:

$(document).ready(function() {
var foods = null;
$.ajax({
    url: '/Train/TrianFood',
    data: {
        Tarrif: 1
    },
    type: "POST",
    context: this,
    error: function() {},
    success: appendFood

});

function appendFood(result) {
    foods = result;
    var parentOfFood = $('#accordion1 .person-information');
    for (var i = 0; i < parentOfFood.length; i++) {
        var foodSelect = $(parentOfFood[i]).find('select[name$=Food]');

        for (var j = 0; j < foods.obj.length; j++) {

            foodSelect.append(new Option(foods.obj[j].ServiceType, foods.obj[j].ServiceTypeCode));
        }
    }
}
});

答案 3 :(得分:0)

以下代码在成功回调ajax之前执行,因此foods保持为空。

var parentOfFood = $('#accordion1 .person-information');
for (var i = 0; i < parentOfFood.length; i++) 
{
    var foodSelect = $(parentOfFood[i]).find('select[name$=Food]');

    for (var j = 0; j <foods.obj.length; j++) 
    {
        foodSelect.append(new Option(foods.obj[j].ServiceType, foods.obj[j].ServiceTypeCode));
     }
 }

将这些代码置于成功回调之下,它将适合您。

希望它可以帮助你。