Próbuję korzystać z nowych funkcji asynchronicznych i mam nadzieję, że rozwiązanie mojego problemu pomoże innym w przyszłości. To jest mój kod, który działa:
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
});
}
Problem polega na tym, że moja pętla while działa zbyt szybko, a skrypt wysyła zbyt wiele żądań na sekundę do interfejsu API Google. Dlatego chciałbym zbudować funkcję uśpienia, która opóźnia żądanie. W ten sposób mógłbym również użyć tej funkcji do opóźnienia innych żądań. Jeśli istnieje inny sposób opóźnienia żądania, daj mi znać.
W każdym razie to mój nowy kod, który nie działa. Odpowiedź żądania jest zwracana do anonimowej funkcji asynchronicznej w ramach setTimeout, ale po prostu nie wiem, jak mogę zwrócić odpowiedź na funkcję uśpienia lub. do początkowej funkcji 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);
}
Próbowałem już kilka opcji: przechowywanie odpowiedzi w zmiennej globalnej i zwrócenie jej z funkcji uśpienia, wywołanie zwrotne w funkcji anonimowej itp.
Promise.all
podejście. Tak prosty i elegancki!