我正在编写一些在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>
根据我的电话,我期待看到:
提醒(&#39; LECTURA BD:&#39; +数据);
提醒(&#39; LECTURA OBTENIDA:&#39; +数组);
但是,顺序完全是对位,导致我的结果失败。这有什么合理的理由吗?
作为额外信息,我在.net MVC和Chrome中使用它。
答案 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);
}'
然后,在服务器响应之前,该代码将不会运行。