1

Tengo un método ASINCRONO en JS llamado gnClienteFirma.Firmar(textoAFirmar). Dicho método tiene dos callbacks una vez ejecutado:

function FirmaResultCallBack(signature) {...} //Si se firma OK.

function FirmaErrorFunction(errorType, errorMessage) {...} Si firma da algún error.

¿Cómo puedo convertir dicho método de ASINCRONO a SINCRONO?

He probado con 'promises' pero no acierto a verlo:

function FirmarPromise(textoAFirmar) {
        return new Promise(function (resolve, reject) {
            gnClienteFirma.Firmar(textoAFirmar, function FirmaResultCallBack(signature) {
                resolve(signature);
            }, function FirmaErrorFunction(errorType, errorMessage) {
                return reject(errorMessage);  
            });
        })
    }
Kiko_L
  • 6,455
  • 1
  • 11
  • 25

2 Answers2

3

otra forma de esperar un valor (igual sigue siendo asincrono) es con async/await, pero esto suele dar mas problemas por compatibilidad

function firmarPromesa(){
  return new Promise(resolve => {
    setTimeout(() => {
      resolve('chispas!!');
    }, 2000);
  });
}
async function esperareUnValor(){
  console.log('ejecuta funcion');
  let chispas = await firmarPromesa();
  console.log(chispas);


}

esperareUnValor()

pero si usas promesas , te dejo un ejemplo

function promesa1(){
    return new Promise(function (resolve, reject) {
        //mi codigo a Validar
           setTimeout(() => {
            resolve('chispas!!');
          }, 2000);
    })
}
function promesa2(message){
    return new Promise(function (resolve, reject) {
        //mi codigo a Validar
        reject("error en la promesa 2 pero recibio " + message )
    })
}
promesa1().
  then(function(message){
    console.log("ejecutando promesa 1")
    return promesa2(message)
  
}).then(function(message){
  console.log("aqui no llegara")
}).catch(function(err){
  console.log("error" ,err)
})

Te recomiendo leer Que es una Promesa en Javascript

JackNavaRow
  • 6,836
  • 5
  • 22
  • 49
2

Una promesa es una forma de encapsular un código asíncrono para hacerlo más manejable, pero no dejará de ser asíncrono. En cualquier caso, si tienes una función así:

function firma(datos,exitoFn,falloFn) {...}

puedes hacer algo como:

let firmaPromesa=new Promise(function (exito,fallo) {
  firma(datos,exito,fallo);
}

firmaPromesa.then(function (signature) {...})
  .catch(function(errorType, errorMessage) {...});
Pablo Lozano
  • 45,934
  • 7
  • 48
  • 87