javascript中意外的执行顺序

时间:2015-06-20 22:39:12

标签: javascript asp.net-ajax

我正在编写一些在js中相互调用的函数,并且按执行顺序发现了一个意外的(由我)行为。

    <script type="text/javascript">

    function rellenarProveedores() {

        var dProveedores = document.getElementById('Proveedor');
        var proveedorActual = document.getElementById('proveedorActual').value;

        while (dProveedores.options.length > 0) {
            dProveedores.remove(0);
        }

        var opt = document.createElement('option');
        opt.text = 'SELECCIONAR PROVEEDOR';
        opt.value = '';
        dProveedores.appendChild(opt);

        var url = '/Incidencias/ObtenerProveedores';
        var array = lecturaBD(url);

        alert('LECTURA OBTENIDA: '+array);

        for (var i = 0; i < array.length; i++) {

            var opt = document.createElement('option');
            var obj = array[i];
            opt.text = obj.Nombre;
            opt.value = obj.ProveedorID;
            if (obj.ProveedorID == proveedorActual) {
                opt.selected = true;
            }
            dProveedores.appendChild(opt);
        }
    }

    function lecturaBD(param) {

        var enviarData;
        var salida;


        $.ajax({
            url: param,
            type: 'POST',
            contentType: 'application/json;',
            data: enviarData,
            success: function (data) {
                alert('LECTURA BD: '+data);
                salida = data;
            },
            error: function (data) { alert('Error'); }
        });

        return salida;
    }

    window.onload = function () { rellenarProveedores() };

</script>

根据我的电话,我期待看到:

  1. 提醒(&#39; LECTURA BD:&#39; +数据);

  2. 提醒(&#39; LECTURA OBTENIDA:&#39; +数组);

  3. 但是,顺序完全是对位,导致我的结果失败。这有什么合理的理由吗?

    作为额外信息,我在.net MVC和Chrome中使用它。

2 个答案:

答案 0 :(得分:1)

Ajax是异步的,不会立即执行。在执行之前,它将等待/Incidencias/ObtenerProveedores上的请求完成。这就是您LECTURA OBTENIDA首先发出警报的原因。 LECTURA BD当时还在等待。

你应该把Ajax之后所需的一切都放在回调上:

function rellenarProveedores() {
    var dProveedores = document.getElementById('Proveedor');
    var proveedorActual = document.getElementById('proveedorActual').value;

    while (dProveedores.options.length > 0) {
        dProveedores.remove(0);
    }

    var opt = document.createElement('option');
    opt.text = 'SELECCIONAR PROVEEDOR';
    opt.value = '';
    dProveedores.appendChild(opt);

    var url = '/Incidencias/ObtenerProveedores';
    lecturaBD(url, function(array){
        alert('LECTURA OBTENIDA: '+array);

        for (var i = 0; i < array.length; i++) {
            var opt = document.createElement('option');
            var obj = array[i];
            opt.text = obj.Nombre;
            opt.value = obj.ProveedorID;
            if (obj.ProveedorID == proveedorActual) {
                opt.selected = true;
            }
            dProveedores.appendChild(opt);
        }
    });
}

function lecturaBD(param, callback) {
    var enviarData;
    $.ajax({
        url: param,
        type: 'POST',
        contentType: 'application/json;',
        data: enviarData,
        success: function( response ) {
            alert('LECTURA BD: '+data);
            callback( response );
        },
        error: function (data) { alert('Error'); }
    });
}

答案 1 :(得分:0)

你正在进行ajax调用,它将立即返回(没有调用你的ajax成功函数),然后它将从你的lecturaBD函数返回然后运行alert('LECTURA OBTENIDA: '+array);当服务器响应时(无论何时可能发生)那么你的ajax成功函数就会运行。

你可能想要创建一个特定的函数来作为你的ajax成功函数。在该函数中,您可以输入以下代码:

        alert('LECTURA OBTENIDA: '+array);

        for (var i = 0; i < array.length; i++) {

            var opt = document.createElement('option');
            var obj = array[i];
            opt.text = obj.Nombre;
            opt.value = obj.ProveedorID;
            if (obj.ProveedorID == proveedorActual) {
                opt.selected = true;
            }
            dProveedores.appendChild(opt);
        }'

然后,在服务器响应之前,该代码将不会运行。