Estou tentando usar os novos recursos assíncronos e espero que resolver meu problema ajude outras pessoas no futuro. Este é o meu 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
});
}
O problema é que meu loop while é executado muito rápido e o script envia muitas solicitações por segundo para a API do Google. Portanto, eu gostaria de criar uma função de suspensão que atrasa a solicitação. Assim, eu também poderia usar essa função para atrasar outros pedidos. Se houver outra maneira de atrasar a solicitação, entre em contato.
De qualquer forma, este é o meu novo código que não funciona. A resposta da solicitação é retornada à função assíncrona anônima dentro do setTimeout, mas simplesmente não sei como posso retornar a resposta à função de suspensão resp. para a função asyncGenerator inicial.
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);
}
Eu já tentei algumas opções: armazenar a resposta em uma variável global e retorná-la da função de suspensão, retorno de chamada na função anônima etc.
fonte
Promise.all
abordagem. Tão simples e elegante!var [parents]
representa? Eu não vi isso antes e é uma coisa difícil de googleasync function
.async
/await
é baseado em promessas. A única coisa que substitui são asthen
chamadas.Desde o nó 7.6 , você pode combinar a função de
promisify
funções do módulo utils comsetTimeout()
.Node.js
Javascript
Uso
fonte
await require('util').promisify(setTimeout)(3000)
também pode ser alcançado sem a necessidade de:await setTimeout[Object.getOwnPropertySymbols(setTimeout)[0]](3000)
getOwnPropertySymbols
versão ... se não estiver quebrada ...!A maneira rápida, de uma linha e em linha
fonte
let sleep = ms => new Promise( r => setTimeout(r, ms));
// uma função de um forroawait new Promise(resolve => setTimeout(resolve, 5000))
setTimeout
não é umaasync
função, portanto você não pode usá-lo com o ES7 async-waitit. Mas você pode implementar suasleep
função usando o ES6 Promise :Então você poderá usar esta nova
sleep
função com o ES7 async-waitit:Observe que estou respondendo apenas à sua pergunta sobre a combinação de ES7 assíncrono / aguardar
setTimeout
, embora possa não ajudar a resolver seu problema com o envio de muitas solicitações por segundo.Atualização: As versões modernas do node.js. possuem uma implementação de tempo limite assíncrono, acessível por meio do utilitário util.promisify :
fonte
fn
lança o erro não seria pego.new Promise
onde você podesleep.catch
.setTimeout
retorno de chamada assíncrono e onew Promise
retorno de chamada foi feito por muito tempo. Irá borbulhar para o contexto global e será lançada como uma exceção não tratada.Se você deseja usar o mesmo tipo de sintaxe,
setTimeout
pode escrever uma função auxiliar como esta:Você pode chamá-lo assim:
Eu fiz uma essência: https://gist.github.com/DaveBitter/f44889a2a52ad16b6a5129c39444bb57
fonte
delayRun
faria mais sentido aqui, pois atrasará a execução da função de retorno de chamada em X segundos. Não é um exemplo muito aguardado, IMO.fonte
O código a seguir funciona no Chrome e Firefox e talvez em outros navegadores.
Mas no Internet Explorer, recebo um erro de sintaxe para o
"(resolve **=>** setTimeout..."
fonte
Fez uma util inspirada de Dave 's resposta
Passado basicamente em um
done
retorno de chamada para chamar quando a operação estiver concluída.É assim que eu uso:
fonte
Esta é a minha versão com o nodejs agora em 2020 nas AWS labdas
fonte
Esta é uma correção mais rápida em uma linha.
Espero que isso ajude.
fonte
await setTimeout(()=>{console.log('first')}, 200); console.log ('second')
impressões segunda seguida primeirosvar test = async () => { await setTimeout(()=>{console.log('first')}, 1000); console.log ('second') }
Estendi o tempo limite para mostrar sua utilidade.