Я пытаюсь использовать новые асинхронные функции и надеюсь, что решение моей проблемы поможет другим в будущем. Это мой код, который работает:
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
});
}
Проблема в том, что мой цикл while работает слишком быстро и скрипт отправляет слишком много запросов в секунду в Google API. Поэтому я хотел бы построить функцию сна, которая задерживает запрос. Таким образом, я мог бы также использовать эту функцию для задержки других запросов. Если есть другой способ задержать запрос, пожалуйста, дайте мне знать.
Во всяком случае, это мой новый код, который не работает. Ответ на запрос возвращается анонимной асинхронной функции в пределах setTimeout, но я просто не знаю, как я могу вернуть ответ на функцию сна, соответственно. к начальной функции 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);
}
Я уже попробовал некоторые варианты: сохранение ответа в глобальной переменной и возврат его из функции сна, обратный вызов в анонимной функции и т. Д.
источник
Promise.all
подход. Так просто и элегантно!var [parents]
представляет? Я не видел этого раньше, и это трудно для Googleasync function
.async
/await
это основано на обещаниях. Единственное, что он заменяет, этоthen
звонки.Начиная с узла 7.6 , вы можете комбинировать функцию
promisify
функций из модуля utils сsetTimeout()
.Node.js
Javascript
использование
источник
await require('util').promisify(setTimeout)(3000)
также можно достичь без необходимости:await setTimeout[Object.getOwnPropertySymbols(setTimeout)[0]](3000)
getOwnPropertySymbols
версия ... если она не сломана ...!Быстрый однострочный, линейный способ
источник
let sleep = ms => new Promise( r => setTimeout(r, ms));
//await new Promise(resolve => setTimeout(resolve, 5000))
setTimeout
это неasync
функция, поэтому вы не можете использовать ее с ES7 async-await. Но вы можете реализовать своюsleep
функцию с помощью ES6 Promise :Тогда вы сможете использовать эту новую
sleep
функцию с ES7 async-await:Обратите внимание, что я отвечаю только на ваш вопрос о комбинировании ES7 async / await с
setTimeout
, хотя это может не помочь решить вашу проблему с отправкой слишком большого количества запросов в секунду.Обновление: современные версии node.js имеют встроенную реализацию асинхронного тайм-аута, доступную через util.promisify помощник :
источник
fn
броски ошибки не будут обнаружены.new Promise
где вы можетеsleep.catch
это.setTimeout
обратный вызов, иnew Promise
обратный вызов был сделан долго. Это будет соответствовать глобальному контексту и будет выброшено как необработанное исключение.Если вы хотите использовать тот же синтаксис, что и
setTimeout
вы, можете написать вспомогательную функцию, например:Затем вы можете назвать это так:
Я сделал суть: https://gist.github.com/DaveBitter/f44889a2a52ad16b6a5129c39444bb57
источник
delayRun
бы имеет больше смысла, так как оно задержит выполнение функции обратного вызова на X секунд. Не очень ожидаемый пример, ИМО.источник
Следующий код работает в Chrome и Firefox и, возможно, в других браузерах.
Но в Internet Explorer я получаю синтаксическую ошибку для
"(resolve **=>** setTimeout..."
источник
Сделано Util вдохновленный от Dave «s ответ
В основном передается
done
обратный вызов для вызова, когда операция завершена.Вот как я это использую:
источник
Это моя версия с nodejs в 2020 году в AWS Labdas
источник
Это быстрее исправить в одной строке.
Надеюсь, это поможет.
источник
await setTimeout(()=>{console.log('first')}, 200); console.log ('second')
печатает второй, затем первыйvar test = async () => { await setTimeout(()=>{console.log('first')}, 1000); console.log ('second') }
Я увеличил время ожидания, чтобы показать его полезность.