Necesita hacer una función esperar durante 4 segundos antes de devolver una cadena, pero no tener suerte. Básicamente esto es lo que estoy tratando de hacer:

function myFunction(){
 var str = '';
// DO SOMEHITNG HERE so when it's done the finally return "I'm done"

 return "I'm done";
}

Esto es lo que tengo actualmente (¿Qué me estoy perdiendo?), Pero también me falta cualquier otra forma de hacerlo. ¡Gracias por adelantado!

function myFunction(){
 var counter = 0;
 var execute =  setInterval(print,  1000);

 function print(){
    document.write("Counting" + counter + "<br/>");
    ++counter;

    if(counter < 5){
        clearInterval(execute);
         str = "I'm done";
    }
 }

  return str; // Here I want to return "I'm done"
}
0
progx 31 oct. 2019 a las 14:41

3 respuestas

La mejor respuesta

No puede retrasar el regreso de una función como desee, pero puede devolver una Promesa. Para situaciones como esa, debe usar sime king of asynchronous function:

function myFunction() {
  return new Promise(function(resolve, reject) {
    setTimeout(function() {
      resolve("I'm done");
    }, 5000)
  }
}

// Now when you use your function, you need to get the results from a then method:

let someVariable;

myFunction().then(function(output) {
  console.log(output); // I'm done
  someVariable = output;
}

console.log(someVariable); // undefined

Tenga en cuenta que las funciones asincrónicas siempre serán asincrónicas. Es por eso que el último registro de la consola generará {{X 0}}.

3
Elias Soares 31 oct. 2019 a las 12:01

En la sección de comentarios, leí que estás usando un AJAX y esperando la respuesta. Así que básicamente puedes usar el siguiente.

function loadDoc() {
  var xhttp = new XMLHttpRequest();
  xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
     // DO THE REQUIRED HERE AFTER RESPONSE
    }
  };
  xhttp.open("GET", "ajax_info.txt", true);
  xhttp.send();
}
0
s_u_f 31 oct. 2019 a las 11:48

Puede usar función asíncrona y WindowOrWorkerGlobalScope.setTimeout ()

function sleep(seconds) {
  return new Promise(result => setTimeout(result, seconds * 1000))
}

async function myFunction() {
  // DO SOMEHITNG HERE so when it's done the finally return "I'm done"
  await sleep(4) // <-- 4 seconds
  return `I'm done`
}

async function asyncCall() {
  let str = ''
  console.log('str:', str) // <-- empty here

  str = await myFunction()
  console.log('str:', str) // <-- I\'m done
}

asyncCall()
0
Yosvel Quintero 1 nov. 2019 a las 04:27