Estoy tratando de usar las nuevas funciones asíncronas y espero que resolver mi problema ayude a otros en el futuro. Este es mi código que está funcionando:
  async function asyncGenerator() {
    // other code
    while (goOn) {
      // other code
      var fileList = await listFiles(nextPageToken);
      var parents = await requestParents(fileList);
      // other code
    }
    // other code
  }
  function listFiles(token) {
    return gapi.client.drive.files.list({
      'maxResults': sizeResults,
      'pageToken': token,
      'q': query
    });
  }
El problema es que mi ciclo while se ejecuta demasiado rápido y el script envía demasiadas solicitudes por segundo a la API de Google. Por lo tanto, me gustaría construir una función de suspensión que retrase la solicitud. Por lo tanto, también podría usar esta función para retrasar otras solicitudes. Si hay otra forma de retrasar la solicitud, hágamelo saber.
De todos modos, este es mi nuevo código que no funciona. La respuesta de la solicitud se devuelve a la función asincrónica anónima dentro de setTimeout, pero simplemente no sé cómo puedo devolver la respuesta a la función de suspensión resp. a la función inicial asyncGenerator.
  async function asyncGenerator() {
    // other code
    while (goOn) {
      // other code
      var fileList = await sleep(listFiles, nextPageToken);
      var parents = await requestParents(fileList);
      // other code
    }
    // other code
  }
  function listFiles(token) {
    return gapi.client.drive.files.list({
      'maxResults': sizeResults,
      'pageToken': token,
      'q': query
    });
  }
  async function sleep(fn, par) {
    return await setTimeout(async function() {
      await fn(par);
    }, 3000, fn, par);
  }
Ya he probado algunas opciones: almacenar la respuesta en una variable global y devolverla desde la función de suspensión, devolución de llamada dentro de la función anónima, etc.
fuente

Promise.allenfoque. ¡Tan simple y elegante!var [parents]representa la notación de ? No lo he visto antes y es algo difícil deasync function.async/awaitse basa en promesas. Lo único que reemplaza son lasthenllamadas.Desde el Nodo 7.6 , puede combinar la función de
promisifyfunciones desde el módulo utils consetTimeout().Node.js
Javascript
Uso
fuente
await require('util').promisify(setTimeout)(3000)también se puede lograr sin necesidad de:await setTimeout[Object.getOwnPropertySymbols(setTimeout)[0]](3000)getOwnPropertySymbolsversión ... ¡si no está rota ...!La forma rápida en línea
fuente
let sleep = ms => new Promise( r => setTimeout(r, ms));// una función de una líneaawait new Promise(resolve => setTimeout(resolve, 5000))setTimeoutno es unaasyncfunción, por lo que no puede usarla con ES7 async-await. Pero podría implementar susleepfunción utilizando ES6 Promise :Entonces podrá utilizar esta nueva
sleepfunción con ES7 async-await:Tenga en cuenta que solo estoy respondiendo su pregunta sobre la combinación de ES7 async / wait con
setTimeout, aunque puede que no ayude a resolver su problema al enviar demasiadas solicitudes por segundo.Actualización: las versiones modernas de node.js tienen una implementación de tiempo de espera asíncrono incorporado , accesible a través de util.promisify helper:
fuente
fnlanza el error no sería atrapado.new Promisedonde puedessleep.catchhacerlo.setTimeoutdevolución de llamada asincrónica y lanew Promisedevolución de llamada se ha realizado durante mucho tiempo. Burbujeará al contexto global y se lanzará como una excepción no controlada.Si desea utilizar el mismo tipo de sintaxis,
setTimeoutpuede escribir una función auxiliar como esta:Luego puede llamarlo así:
Hice una idea esencial: https://gist.github.com/DaveBitter/f44889a2a52ad16b6a5129c39444bb57
fuente
delayRuntendría más sentido aquí, ya que retrasará la ejecución de la función de devolución de llamada en X segundos. No es un ejemplo muy esperado, OMI.fuente
El siguiente código funciona en Chrome y Firefox y quizás en otros navegadores.
Pero en Internet Explorer obtengo un error de sintaxis para
"(resolve **=>** setTimeout..."fuente
Hizo una utilidad inspirada en la respuesta de Dave
Básicamente pasado en una
donedevolución de llamada para llamar cuando finaliza la operación.Así es como lo uso:
fuente
Esta es mi versión con nodejs ahora en 2020 en AWS labdas
fuente
Esta es una solución más rápida en una sola línea.
Espero que esto ayude.
fuente
await setTimeout(()=>{console.log('first')}, 200); console.log ('second')imprime segundo y luego primerovar test = async () => { await setTimeout(()=>{console.log('first')}, 1000); console.log ('second') }He extendido el tiempo de espera para mostrar su utilidad.