This question already has answers here:
How do I return the response from an asynchronous call?
                                
                                    (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