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.
Promise.all
abordagem. Tão simples e elegante!