Tengo un botón que ejecuta la siguiente función cuando se hace clic:
async function VerifyData() { if(condition1) { MessageBox("Operation Not Allowed."); return; } //Code to form the Ids is here let result = await additionalCheck(Ids); //Passing Ids to Check if(result) { $("#Window").data("kendoWindow").open().center(); } else { return; } } La función additionalCheck(Ids) es la siguiente:
function additionalCheck(Ids) { let count = 0; return new Promise(resolve => { $.ajax({ url: '@Url.Action("GetDetails", "Data")', type: 'POST', dataType: "text", data: { ids: Ids }, success: function (data) { isSuccess = true; count = data; }, error: function (x, y, z) { isSuccess = false; } }).done(function () { $.unblockUI(); if (isSuccess) { if (count > 0) { MessageBox("Operation Invalid."); resolve(false); // This should prevent the verifyData() function also to terminate its execution } else { resolve(true);//It should return to the previous function and execute the next line. } } else { MessageBox("Error. Please try again."); return; } }); }); } El problema al que me enfrento es cuando se llama a la función additionalCheck(Ids) , el código no espera la ejecución de la instrucción ajax y, en su lugar, abre la ventana de Kendo antes de que se complete la ejecución de la función. Quiero VerifyData() para esperar la ejecución de la función additionalCheck(Ids) antes de ejecutar la declaración después de la llamada de la función.
Intenté usar Promise pero no me funcionó (quizás no lo hice correctamente). ¿Cómo puedo lograr esto?
Para aclarar las cosas, JavaScript espera la ejecución de la función AdditionalCheck, pero no esperará la finalización de la solicitud ajax, que es asíncrona, deberá usar una promesa:
//Passing Ids to Check additionalCheck(Ids).then(() => { $("#Window").data("kendoWindow").open().center(); }) function additionalCheck(Ids) { return new Promise((resolve, reject) => { let count = 0; $.ajax({ url: '@Url.Action("GetDetails", "Data")', type: 'POST', dataType: "text", data: { ids: Ids }, success: function (data) { isSuccess = true; count = data; }, error: function (x, y, z) { isSuccess = false; } }).done(function () { $.unblockUI(); if (isSuccess) { if (count > 0) { MessageBox("Operation Invalid."); reject(); } else { resolve(); } } else { MessageBox("Error. Please try again."); reject(); } }); }) } pero en ese caso particular, como se señaló en los comentarios, es más simple mover $("#Window").data("kendoWindow").open().center(); en el .hecho()