asynchronous函数+ await + setTimeout的组合
我试图使用新的ES7asynchronousfunction,我希望解决我的问题将在未来帮助其他人。 这是我的代码正在工作:
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 }); }
问题是,我的循环运行速度太快,脚本每秒发送太多的请求到谷歌API。 因此,我想build立一个延迟请求的睡眠function。 因此我也可以使用这个函数来延迟其他请求。 如果还有其他方式推迟请求,请告诉我。
无论如何,这是我的新代码不起作用。 请求的响应返回给setTimeout中的匿名asynchronous函数,但我不知道如何将响应返回到睡眠函数resp。 到最初的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); }
我已经尝试了一些select:将响应存储在全局variables中,并从睡眠函数返回,匿名函数内的callback等。
你的sleep
function不起作用,因为setTimeout
没有(还)?返回一个可以await
的承诺。 您需要手动提交
function timeout(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } async function sleep(fn, ...args) { await timeout(3000); return fn(...args); }
顺便说一句,减慢你的循环,你可能不想使用一个callback的sleep
函数,并像这样推迟。 我宁愿推荐做类似的事情
while (goOn) { // other code var [parents] = await Promise.all([ listFiles(nextPageToken).then(requestParents), timeout(5000) ]); // other code }
这让parents
的计算至less需要5秒钟。
setTimeout
不是一个async
函数,所以你不能在ES7 async-await中使用它。 但是你可以使用ES6 Promise实现你的sleep
function:
function sleep (fn, par) { return new Promise((resolve) => { // wait 3s before calling fn(par) setTimeout(() => resolve(fn(par)), 3000) }) }
那么你就可以使用这个新的sleep
function与ES7asynchronous等待:
var fileList = await sleep(listFiles, nextPageToken)
请注意 ,我只回答关于将ES7asynchronous/等待与setTimeout
结合的问题,尽pipe它可能无助于解决您每秒发送太多请求的问题。
- 同步等待asynchronous操作,为什么Wait()在这里冻结程序
- 创build一个完成的任务
- StaTaskScheduler和STA线程消息抽取
- 我必须做些什么来使我的方法等待?
- asynchronous是否等待关键字相当于一个ContinueWith lambda?
- 为什么要创buildasynchronousWebAPI操作而不是同步?
- 使用ConfigureAwait(false)和Task.Run之间有什么区别?
- 为什么我会打扰使用Task.ConfigureAwait(continueOnCapturedContext:false);
- 在方法名称中使用“asynchronous”后缀取决于是否使用“asynchronous”修饰符?