非同期関数、Await、setTimeout の組み合わせ
このガイドでは、最新の JavaScript 非同期機能を利用して、一般的なパフォーマンスの問題の解決策を提供します。短期間に過剰なリクエストを Google API に送信する。目標は、スリープ関数を導入してリクエストを遅延させ、スクリプトのパフォーマンスを向上させることです。
元のコード:
この最初のコードは、非同期/待機パターンを効率的に採用しています:
async function asyncGenerator() { while (goOn) { var fileList = await listFiles(nextPageToken); var parents = await requestParents(fileList); } }
問題:
コードが実行されるwhile ループが速すぎるため、Google API へのリクエストが大量に発生しました。
試行された解決策:
これに対処するために、スリープ関数が作成されました:
async function sleep(fn, par) { return await setTimeout(async function() { await fn(par); }, 3000, fn, par); }
ただし、この関数はリクエストの応答を返すことができません。
正しい実装:
スリープ関数の問題は、setTimeout によって返される Promise が欠如していることにあります。これを解決するには、約束されたバージョンを作成できます:
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 中国語 Web サイトの他の関連記事を参照してください。