VBscript síncrono cambió a JavaScript incorrectamente asíncrono [duplicado]
Entonces, mi jefe me pidió que investigara un problema en el que están trasladando scripts VBscript antiguos a scripts Javascript, pero donde Javascript tiene un flujo de programa incorrecto. El único problema es que realmente ignoro ambos, pero si tu jefe te pregunta, entonces tienes que hacer un plan. ;-)
En el VBscript, se le dio al usuario una opción y si "No" no se mostraba la siguiente pantalla / vista. Sin embargo, con Javascript, la siguiente pantalla / vista se carga independientemente de si el usuario elige "No / Cancelar" o no. Esto no debería suceder.
Aquí está el VBscript, la parte importante está entre //:
vEffectiveDate = ScreenForm("smoke.Effective Date").Value
vLastRunDate = ScreenForm("smoke.Last Run Date").Value
sStatus = ScreenForm("smoke.Calc Status").Value
vMsg = ""
If Len(sStatus) = 0 Then
sStatus = "SUCCESFUL"
ScreenForm("smoke.Calc Status").Value = sStatus
End If
If Len(vEffectiveDate) > 0 Then
If Not IsDate(vEffectiveDate) Then
vMsg = vMsg & "[Effective Date] Is not a date." & Chr(13)
ElseIf cdate(vEffectiveDate) <= cdate(vLastRunDate) Then
vMsg = vMsg & "[Effective Date] cannot be on/before " & vLastRunDate &"." & Chr(13)
End IF
End If
//////////////////////////////////////////////////////////////////////////////
If UCASE(sStatus) <> "SUCCESFUL" Then
sResponse = MsgBox ("Forecast calculation still busy. Results might not be accurate. Continue?", (vbYesNo), "WARNING")
If sResponse = vbNo Then
MsgBox cstr("Screen will refresh. Please click on Update to try again."), (vbOKOnly), "INFORMATION"
ScreenForm("smoke.Calc Status").Value = "REFRESH"
'msErr = "ABORT"
End If
End If
//////////////////////////////////////////////////////////////////////////////
If vMsg <> "" Then
MsgBox (vMsg)
msErr = "ERROR"
End If
Aquí está el Javascript, la parte importante está entre //:
var vEffectiveDate="";
var vLastRunDate="";
var sStatus="";
var vMsg="";
var sResponse="";
vEffectiveDate = document.getElementById("Smoke.Effective Date").value;
vLastRunDate = document.getElementById("Smoke.Last Run Date").value;
sStatus = document.getElementById("Smoke.Calc Status").value;
vMsg = "";
if ((sStatus).length == 0 ){
sStatus = "SUCCESFUL";
document.getElementById("Smoke.Calc Status").value= sStatus;
}
if ((vEffectiveDate).length > 0 ){
if (!isDate(vEffectiveDate) ){
vMsg = vMsg+"[Effective Date] Is not a date." + ";\r\n";
} else if ( moment( toDate(vEffectiveDate)).isBefore(toDate(vLastRunDate)) ){
vMsg = vMsg+"[Effective Date] cannot be on/before "+vLastRunDate+"." + ";\r\n";
}
}
///////////////////////////////////////////////////////////
if ((sStatus).toUpperCase() != "SUCCESFUL" ){
$.confirm({title: "Confirmation",columnClass: 'col-md-6 col-md-offset-3', content:"Forecast calculation still busy. Results might not be accurate. Continue?", buttons: {confirm: function() { sResponse= 1;}, cancel: function() {sResponse= 2;return;}}}); if (sResponse == 2 ){ $.alert({title: "INFORMATION",columnClass: 'col-md-6 col-md-offset-3', content:("Screen will refresh. Please click on Update to try again.").toString(),});
document.getElementById("Smoke.Calc Status").value= "REFRESH";
msErr = "ABORT";
}
}
//////////////////////////////////////////////////////////
if (vMsg != "" ){
$.alert({title: 'Validation Message',columnClass: 'col-md-6 col-md-offset-3', content:(vMsg),});
msErr = "ERROR";
}
Entonces, he visto que hay un concepto de async-await-promises en Javascript, pero parece que Internet Explorer no lo admite , y debemos tener en cuenta que algunos de nuestros usuarios todavía usan IE ... suspiro ... Parece que no podré usar un concepto de espera asincrónica, no es que esté seguro de que sería necesario en esta situación.
Entonces, también leí aquí sobre un botón de envío para un formulario , y que ese también podría ser mi problema
No tengo ni idea de Javascript, ni siquiera sé cómo cambiar el comportamiento predeterminado del botón si ese es el problema.
Agradecería que alguien me ayude en la dirección correcta para que pueda aprender y crecer.
Respuestas
De hecho, la segunda parte del código (con la alerta) se ejecuta independientemente del resultado de la solicitud de confirmación.
La principal diferencia con $.confirmy VBA MsgBoxes que MsgBoxbloquea la ejecución posterior del código, mientras $.confirmque no lo hace. Eso significa que el código que le sigue (la if (sResponse == 2)parte), se ejecuta inmediatamente. En ese momento no se hizo ningún cambio sResponse(ya que no se hizo clic en ningún botón), por lo que llega demasiado pronto.
Sin embargo, $.confirmacepta algunas funciones como argumentos, que se llamarán cuando se presione un botón en la ventana emergente. En realidad, su código ya pasa tales funciones, pero no hacen nada más que configurar sResult. Por lo tanto, debe mover la segunda parte del código (con la alerta) en dicha función.
Primero, formateemos un poco su código para que sea más legible y pueda detectar mejor esas funciones de devolución de llamada:
if ((sStatus).toUpperCase() != "SUCCESFUL") {
$.confirm({
title: "Confirmation",
columnClass: 'col-md-6 col-md-offset-3',
content:"Forecast calculation still busy. Results might not be accurate. Continue?",
buttons: {
confirm: function() {
// This executes when button is clicked
sResponse= 1;
},
cancel: function() {
// This executes when button is clicked
sResponse= 2;
return;
}
}
});
// This executes immediately (without waiting for button click)
if (sResponse == 2 ){
$.alert({ title: "INFORMATION", columnClass: 'col-md-6 col-md-offset-3', content:("Screen will refresh. Please click on Update to try again.").toString(), }); document.getElementById("Smoke.Calc Status").value= "REFRESH"; msErr = "ABORT"; } } // Also this executes too early when confirm was executed: if (vMsg != ""){ $.alert({
title: 'Validation Message',
columnClass: 'col-md-6 col-md-offset-3',
content:(vMsg),
});
msErr = "ERROR";
}
Agregué comentarios para mostrar dónde están las partes importantes del código.
Ahora mueva esa segunda parte dentro de la función de devolución de llamada que se relaciona con la respuesta n. ° 2:
if (sStatus.toUpperCase() != "SUCCESFUL") {
$.confirm({ title: "Confirmation", columnClass: 'col-md-6 col-md-offset-3', content:"Forecast calculation still busy. Results might not be accurate. Continue?", buttons: { confirm: function() { sResponse= 1; processMessage(); // <--- added this }, cancel: function() { sResponse= 2; // Moved code here, as it needs to execute when Cancel is clicked $.alert({
title: "INFORMATION",
columnClass: 'col-md-6 col-md-offset-3',
content: "Screen will refresh. Please click on Update to try again.",
// Code that should execute when alert is closed:
onAction: function () {
document.getElementById("Smoke.Calc Status").value= "REFRESH";
msErr = "ABORT";
processMessage(); // <--- added this
}
});
},
}
});
} else { // <-- added
processMessage();
}
function processMessage() {
// Moved code in a function, as it should only execute after confirm/alert is closed
if (vMsg != "") {
$.alert({
title: 'Validation Message',
columnClass: 'col-md-6 col-md-offset-3',
content: vMsg,
});
msErr = "ERROR";
}
}
No probé este código, ya que tiene dependencias que no conozco.