This question already has answers here:
How do I return the response from an asynchronous call?
(36个答案)
5年前关闭。
当执行以下代码时,firebug告诉我:msj [0]未定义是什么问题?
我想做的是每次运行后每次收到响应时,在调用msg生成单个警报以将所有答案一起显示给我之后,将其捕获到数组中。
我不明白为什么如果数组有数据,在这种情况下有三个数据,为什么我显示未定义。
编辑:听起来您想收集所有回复,然后在收到所有回复后执行一些操作。在
(36个答案)
5年前关闭。
当执行以下代码时,firebug告诉我:msj [0]未定义是什么问题?
我想做的是每次运行后每次收到响应时,在调用msg生成单个警报以将所有答案一起显示给我之后,将其捕获到数组中。
我不明白为什么如果数组有数据,在这种情况下有三个数据,为什么我显示未定义。
var msj = [];
for (var a = document.querySelectorAll('table.inventory tbody tr'), i = 0; a[i]; ++i) {
// get inventory row cells
cells = a[i].querySelectorAll('span:last-child');
// buscar la selecion del concepto
var opciones = cells[0].querySelectorAll('option:checked');
var value_concept = opciones[0].value;
// set price as cell[2] * cell[3]
var Uno = value_concept;
var Dos = cells[1].innerHTML ;
var Tres = parseFloatHTML(cells[2]);
var Cuatro = parseFloatHTML(cells[3]);
var Cinco = parseFloatHTML(cells[4]);
var id_fac = id_fac_select;
var valor_fac = costo_fac_select.split(".");
var valor_fact = valor_fac[0];
var valor_recibo = Cinco;
$.ajax({
url:"js.php",
cache:false,
type:"POST",
data:{concepto:Uno,descripcion:Dos,valor_total:Tres,valor_pagado:Cuatro,valor_f:valor_fact,saldo_pendiente:valor_recibo,numero_factura:id_fac,id_estudiante:id_student},
success:function(result)
{
msj.push(result);
}
});
}
console.log(msj);
alert(msj[0]);
最佳答案
您正在undefined
中看到alert()
,因为msj
尚无数据。在浏览器收到服务器响应之前,不会调用填充msj
的代码,但是会立即调用alert(msg[0])
代码。
如果您在console.log(msj)
控制台中看到数据,这是因为控制台在扩展对象之前不会评估对象。请参见this question。尝试将console.log更改为以下之一:
console.log(JSON.stringify(msj));
console.log(msj.length);
console.log(msj.join(","));
编辑:听起来您想收集所有回复,然后在收到所有回复后执行一些操作。在
success
处理程序中,将结果添加到msj
后,检查length
以查看是否已全部收到。收到所有响应后,msj.length
应与a.length
相同:success: function (result) {
msj.push(result);
if (msj.length == a.length) {
// All responses have been received. Ready to use msj!
}
}
09-25 18:53