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等。

你的sleepfunction不起作用,因为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实现你的sleepfunction:

 function sleep (fn, par) { return new Promise((resolve) => { // wait 3s before calling fn(par) setTimeout(() => resolve(fn(par)), 3000) }) } 

那么你就可以使用这个新的sleepfunction与ES7asynchronous等待:

 var fileList = await sleep(listFiles, nextPageToken) 

请注意 ,我只回答关于将ES7asynchronous/等待与setTimeout结合的问题,尽pipe它可能无助于解决您每秒发送太多请求的问题。