我已经搜索了其他问题/答案并实现了所有内容,但我仍然无法访问该对象的值。这是我正在使用的代码:
function apply_voucher(voucher) {
var dates = $.parseJSON($("[name='dates']").val());
var voucher_yes_no = new Array();
var voucher_reduction = new Array();
if(voucher.length > 0)
{
$.each(dates, function(room_id, these_dates) {
$.post('/multiroom/check_voucher/'+voucher+'/'+room_id, function(result) {
if(result.result == 'ok') {
voucher_yes_no.push('yes');
voucher_reduction.push(result.voucher_reduction);
} else {
voucher_yes_no.push('no');
}
}, 'json');
});
// check if there are any yes's in the array
if('yes' in voucher_yes_no) {
console.log("no yes's");
} else {
console.log(voucher_reduction);
console.log(typeof voucher_reduction);
for (var prop in voucher_reduction) {
console.log(prop);
console.log(voucher_reduction[prop]);
if (voucher_reduction.hasOwnProperty(prop)) {
console.log("prop: " + prop + " value: " + voucher_reduction[prop]);
}
}
}
}
}
为常量console
日志记录道歉 - 我只是想跟踪所有内容,以确保它们都在做它应该做的事情。我得到的控制台输出如下:
...显示对象包含一个值"1.01"
和我console.log
的{{1}},以确保它实际上是一个对象(因为我以为我疯了在一个点上)。在此之后,for-in循环内部没有任何内容。我试过jquery的typeof
也无济于事。我无法理解为什么我正在努力的工作正在发挥作用!
答案 0 :(得分:1)
它不起作用,因为Ajax调用是异步的!
您正在阅读填充之前的值!
将代码移入并观察它会神奇地开始工作,因为它会在您实际填充数组后运行!
function apply_voucher(voucher) {
var room_id = "169";
var dates = $.parseJSON($("[name='dates']").val());
var voucher_reduction = new Array();
$.post('/multiroom/check_voucher/'+voucher+'/'+room_id, function(result) {
if(result.result == 'ok') {
voucher_reduction.push(result.voucher_reduction);
}
console.log(voucher_reduction);
console.log(typeof voucher_reduction);
for (var prop in voucher_reduction) {
console.log(prop);
console.log(voucher_reduction[prop]);
if (voucher_reduction.hasOwnProperty(prop)) {
console.log("prop: " + prop + " value: " + voucher_reduction[prop]);
}
}
}, 'json');
}
从它看起来,你计划在循环中进行Ajax调用。为此,您需要等待所有请求完成。您需要使用when()
和then()
。在另一个问题中回答:https://stackoverflow.com/a/9865124/14104
答案 1 :(得分:1)
对于未来的观众来说,改变我这样做的方式来使用适当的延迟对象和承诺,这让我头脑发热了一段时间,但我到了那里!感谢所有的帮助,特别是@epascarello指出我正确的方向:)一旦我开始这样做,阵列开始表现得像阵列一样,万岁!
这是最终的代码:
function apply_voucher(voucher) {
var booking_id = $("[name='booking_id']").val();
var dates = $.parseJSON($("[name='dates']").val());
if(voucher.length > 0) {
var data = []; // the ids coming back from serviceA
var deferredA = blah(data, voucher, dates); // has to add the ids to data
deferredA.done(function() { // if blah successful...
var voucher_yes_no = data[0];
var voucher_reduction = data[1];
if(voucher_yes_no.indexOf("yes") !== -1)
{
console.log("at least one yes!");
// change value of voucher_reduction field
var reduction_total = 0;
for(var i = 0; i < voucher_reduction.length; i++) {
reduction_total += voucher_reduction[i];
}
console.log(reduction_total);
}
else
{
console.log("there are no yes's");
}
});
}
}
function blah(data, voucher, dates) {
var dfd = $.Deferred();
var voucher_yes_no = new Array();
var voucher_reduction = new Array();
var cycles = 0;
var dates_length = 0;
for(var prop in dates) {
++dates_length;
}
$.each(dates, function(room_id, these_dates) {
$.post('/multiroom/check_voucher/'+voucher+'/'+room_id, function(result) {
if(result.result == 'ok') {
voucher_reduction.push(result.voucher_reduction);
voucher_yes_no.push('yes');
} else {
voucher_yes_no.push('no');
}
++cycles;
if(cycles == dates_length) {
data.push(voucher_yes_no);
data.push(voucher_reduction);
dfd.resolve();
}
}, 'json');
});
return dfd.promise();
}
答案 2 :(得分:0)
在这一行:
console.log(vouncher_reduction[prop]);
^
变量的名称是错误的(n
),可能会破坏您的代码。
答案 3 :(得分:0)
您能说明如何定义voucher_reduction吗? 我想知道调试输出的第二行来自哪里,一个以'0'开头。
答案 4 :(得分:0)
我认为你的循环没有问题。 但也许与你的对象。
您确定哪些属性可枚举? 尝试执行此操作以检查:
Object.getOwnPropertyDescriptor(voucher_reduction,'0');
如果返回undefined,则该属性不存在。