結合非同步函數、Await 和setTimeout
利用最新的JavaScript 非同步功能,本指南提供了常見效能問題的解決方案:在短時間內向Google API 發送過多請求。目標是引入睡眠函數來延遲請求並增強腳本效能。
原始程式碼:
此初始程式碼有效地採用了非同步/等待模式:
async function asyncGenerator() { while (goOn) { var fileList = await listFiles(nextPageToken); var parents = await requestParents(fileList); } }
問題:
程式碼執行while 迴圈的速度太快,導致向Google API 發出大量請求。
嘗試的解決方案:
為了解決這個問題,創建了一個 sleep 函數:
async function sleep(fn, par) { return await setTimeout(async function() { await fn(par); }, 3000, fn, par); }
但是函數無法回傳請求回應
正確實作:
sleep 函數的問題在於缺少 setTimeout 傳回的承諾。為了解決這個問題,可以創建一個承諾版本:
function timeout(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } async function sleep(fn, ...args) { await timeout(3000); return fn(...args); }
最佳化循環:
為了減慢循環執行速度,可以使用暫停整個計算的睡眠函數不是最佳的。更好的方法是使用包含 sleep 函數的 Promise.all 建構:
while (goOn) { var [parents] = await Promise.all([ listFiles(nextPageToken).then(requestParents), timeout(5000) ]); }
此修改可確保父母的計算至少需要 5 秒,有效減慢循環並防止過多的 API請求。
以上是在 JavaScript 中使用 Async/Await 時如何防止過多的 API 請求?的詳細內容。更多資訊請關注PHP中文網其他相關文章!