我尝试在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));
}
}
});
答案 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));
}
}
将这些代码置于成功回调之下,它将适合您。
希望它可以帮助你。