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.all
enfoque. ¡Tan simple y elegante!var [parents]
representa la notación de ? No lo he visto antes y es algo difícil deasync function
.async
/await
se basa en promesas. Lo único que reemplaza son lasthen
llamadas.Desde el Nodo 7.6 , puede combinar la función de
promisify
funciones 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)
getOwnPropertySymbols
versió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))
setTimeout
no es unaasync
función, por lo que no puede usarla con ES7 async-await. Pero podría implementar susleep
función utilizando ES6 Promise :Entonces podrá utilizar esta nueva
sleep
funció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
fn
lanza el error no sería atrapado.new Promise
donde puedessleep.catch
hacerlo.setTimeout
devolución de llamada asincrónica y lanew Promise
devolució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,
setTimeout
puede escribir una función auxiliar como esta:Luego puede llamarlo así:
Hice una idea esencial: https://gist.github.com/DaveBitter/f44889a2a52ad16b6a5129c39444bb57
fuente
delayRun
tendrí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
done
devolució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.