JavaScriptでバックグラウンドタスクをスケジュールする方法
コアポイント
- JavaScriptは、一度に1つのタスクしか実行できないブロッキング言語です。これにより、長期にわたるスクリプトがブラウザを反応させないようにする可能性があります。ただし、それほど重要ではないバックグラウンドタスクを、ユーザーエクスペリエンスに直接影響を与えることなく実行するようにスケジュールすることができます。
-
requestIdleCallback
は、ブラウザがアイドル状態であるときに不必要なタスクをスケジュールできるAPIであり、requestAnimationFrame
の機能と同様です。ブラウザがアイドル状態でなくても、タスクが設定されたタイム範囲内で実行されるように、タイムアウトオプションで使用できます。 -
requestIdleCallback
は、ブラウザのサポートが限られている実験機能であり、予測不可能な時間を実行したり、約束のタスクを解決するタスクには適していません。 DOMへの直接アクセスを必要とするサポートされていないブラウザーまたはタスクの場合、WebワーカーまたはsetTimeout
などの代替案を使用できます。
JavaScriptの他のすべてを忘れた場合は、常にこれを覚えておいてください。ブラウザを機能させる魔法の処理ウィザードを想像してください。 HTMLのレンダリング、メニューコマンドへの応答、画面の描画、マウスのクリックの取り扱い、JavaScript関数の実行など、これはすべて単一のスプライトで処理されます。私たちのほとんどと同様に、エルフは一度に1つしかできません。エルフに多くのタスクを投げた場合、それらは大きなToDoリストに追加され、順番に処理されます。 Spriteがスクリプトタグに遭遇するか、JavaScript関数を実行する必要があるときに、他のすべてが停止します。コード(必要に応じて)がダウンロードされ、さらにイベントまたはレンダリングが処理される直前に実行されます。これは、スクリプトが何でもできるため、これが必要です。より多くのコードを読み込み、各DOM要素を削除し、別のURLにリダイレクトするなどです。 2つ以上のスプライトがあっても、最初のスプライトがコードを処理するときに他のスプライトが機能するのを停止する必要があります。これはブロックです。これが、長期にわたるスクリプトがブラウザを反応させない理由です。通常、コードがウィジェットとイベントハンドラーを初期化するため、JavaScriptをできるだけ早く実行する必要があります。ただし、以下など、ユーザーエクスペリエンスに直接影響しないバックエンドタスクがいくつかあります。
- 分析データを記録します
- ソーシャルネットワークにデータを送信します(または57の「共有」ボタンを追加します)
- プレッチコンテンツ
- プリプロセシングまたはプレレンダリングhtml
これらは時間的に批判的なタスクではありませんが、ページに応答性を維持するために、ユーザーがコンテンツをスクロールしたり対話したりしても実行しないでください。 1つのオプションは、別のスレッドで同時にコードを実行できるWebワーカーを使用することです。これは、プリフェッチと処理に最適ですが、DOMへの直接アクセスや更新を許可しません。独自のスクリプトでこれを回避できますが、Google Analyticsなどのサードパーティのスクリプトが必要ないことを保証することはできません。別の可能性は、setTimeout
などです。ブラウザは、他のすぐに実行されたタスクが完了した後にsetTimeout(doSomething, 1);
関数を実行します。実際、To Doリストの下部に配置されています。残念ながら、この機能は処理要件に関係なく呼び出されます。 doSomething()
requestIdleCallback
は、ブラウザの呼吸の瞬間に必須でないバックエンドタスクをスケジュールするように設計された新しいAPIです。次の塗り直しの前にアニメーションを更新するために関数を呼び出すrequestIdleCallback
を思い出させます。詳細については、requestAnimationFrame
こちらをご覧ください。
requestAnimationFrame
このようにサポートするかどうかを確認できます:
タイムアウト(ミリ秒単位)を使用してオプションオブジェクトパラメーターを指定することもできます。
requestIdleCallback
これにより、ブラウザがアイドル状態であるかどうかに関係なく、機能が最初の3秒以内に呼び出されることが保証されます。
if ('requestIdleCallback' in window) { // requestIdleCallback 受支持 requestIdleCallback(backgroundTask); } else { // 不支持 - 执行其他操作 setTimeout(backgroundTask1, 1); setTimeout(backgroundTask2, 1); setTimeout(backgroundTask3, 1); }
requestIdleCallback(backgroundTask, { timeout: 3000 });
requestIdleCallback
- 実行可能タスクの残りのミリ秒を返す関数
didTimeout
タスクには、50ミリ秒以下の実行時間が割り当てられます。この制限を超えるタスクを停止することはありませんが、さらに処理をスケジュールするために を再度呼び出す方が良いです。複数のタスクを順番に実行する簡単な例を作成しましょう。タスクは、関数の参照として配列に保存されます:-
timeRemaining()
で実行すべきではないアクション
timeRemaining()
ポール・ルイスがこのトピックに関する彼のブログ投稿で指摘しているように、あなたが実行する作品は片側に分割されるべきです。予測不可能な実行時間(DOMを操作するなど、requestIdleCallback
コールバックを使用して行うのが最適です)の場合は何のためにも機能しません。また、時間が残っていなくても、アイドルコールバックが完了した直後にコールバックが実行されるため、約束を解決(または拒否)するように注意する必要があります。
requestIdleCallback
ブラウザサポート
requestIdleCallback
は実験機能であり、仕様はまだ変化しているため、APIの変更に遭遇したときは驚かないでください。 Chrome 47でサポートされています…これは2015年末までに利用できるはずです。また、オペラはこの機能をすぐに入手する必要があります。 MicrosoftとMozillaはどちらもAPIの使用を検討しており、有望に聞こえます。 Appleにはいつものようにニュースはありません。今日試してみたい場合は、Chrome Canary(前者ほど良くないが最新のクールな機能があるChromeの更新バージョン)を使用する最良の方法です。 Paul Lewis(上記)は、シンプルなrequestIdleCallback
シムを作成します。これはAPIの説明を実装しますが、ブラウザのアイドル検出動作をシミュレートできるポリフィルではありません。上記の例のようにsetTimeout
を使用する方法を使用しますが、オブジェクトの検出とコードフォーキングなしでAPIを使用する場合は良いオプションです。今日は限られたサポートがありますが、requestIdleCallback
は、Webパフォーマンスを最大化するのに役立つ興味深いツールかもしれません。しかし、あなたはどう思いますか?以下のコメントセクションであなたの考えを聞きたいです。
のスケジューリングバックエンドタスクの
FAQJavaScriptのバックグラウンドタスクAPIは何ですか?
JavaScriptの背景タスクAPIは、メインスレッドがアイドル状態であっても、開発者がバックグラウンドで実行されるタスクをスケジュールできる強力なツールです。このAPIは、メインスレッドをブロックせずにこれらのタスクを実行し、ユーザーエクスペリエンスの不良につながる可能性があるため、多くの計算またはネットワークリクエストを必要とするタスクに特に適しています。バックエンドタスクAPIは、最新のブラウザが提供するより大きなWeb APIの一部であり、従来のまたはsetTimeout
メソッドよりも、バックエンドタスクを処理するためのより効率的でパフォーマンス指向の方法を提供します。 setInterval
およびsetTimeout
とどのように異なりますか? setInterval
およびsetTimeout
関数は、特定の遅延または定期的な間隔で実行するタスクをスケジュールするために使用されるJavaScriptの従来の方法です。ただし、これらのアプローチには、特にパフォーマンスの点でいくつかの制限があります。彼らはメインスレッドで実行されます。つまり、完了するのに時間がかかりすぎると、他のタスクをブロックし、ユーザーエクスペリエンスが悪い可能性があります。一方、バックグラウンドタスクAPIは、メインスレッドとは別にバックグラウンドでタスクを実行します。これは、メインスレッドのパフォーマンスに影響を与えることなく、より集中的なタスクを処理できることを意味します。 setInterval
バックエンドタスクAPIは、最新のブラウザが提供するWeb APIに比較的新しい追加であるため、すべてのブラウザーでサポートされない場合があります。プロジェクトでAPIを使用することを計画している場合、使用する予定のAPIの現在のサポートレベルを常に確認することが最善です。使用できるWebサイトは、さまざまなブラウザーのさまざまなAPIのサポートレベルに関する最新情報を提供します。
バックグラウンドタスクAPIを使用して、バックグラウンドで実行されているタスクをスケジュールする方法は?
バックグラウンドタスクAPIを使用してタスクをスケジュールするには、requestIdleCallback
メソッドを使用できます。このメソッドは、コールバック関数を最初のパラメーターとして取得します。これは、ブラウザーがアイドル状態のときに実行されます。基本的な例は次のとおりです
if ('requestIdleCallback' in window) { // requestIdleCallback 受支持 requestIdleCallback(backgroundTask); } else { // 不支持 - 执行其他操作 setTimeout(backgroundTask1, 1); setTimeout(backgroundTask2, 1); setTimeout(backgroundTask3, 1); }
メソッドを使用できます。この方法では、IDをそのパラメーターとしてrequestIdleCallback
で返します。例は次のとおりです。cancelIdleCallback
requestIdleCallback
タイムアウトオプションの使用は
requestIdleCallback(backgroundTask, { timeout: 3000 });
のタイムアウトオプションは、requestIdleCallback
の最大時間(ミリ秒単位で)を指定します。ブラウザは、アイドル状態でなくても、コールバックを実行する前に待機する必要があります。これは、バックグラウンドタスクが特定の時間枠内で実行する必要がある場合に役立ちます。
requestIdleCallback
バックグラウンドタスクのエラーを処理する方法は?
node.jsでバックグラウンドタスクAPIを使用できますか?
// 要运行的函数数组 var task = [ background1, background2, background3 ]; if ('requestIdleCallback' in window) { // requestIdleCallback 受支持 requestIdleCallback(backgroundTask); } else { // 不支持 - 尽快运行所有任务 while (task.length) { setTimeout(task.shift(), 1); } } // requestIdleCallback 回调函数 function backgroundTask(deadline) { // 如果可能,运行下一个任务 while (deadline.timeRemaining() > 0 && task.length > 0) { task.shift()(); } // 如果需要,安排进一步的任务 if (task.length > 0) { requestIdleCallback(backgroundTask); } }
約束でバックグラウンドタスクAPIを使用できますか?
バックグラウンドタスクAPIは約束を返さないため、Async/awaitで直接使用することはできません。ただし、非同期のコンテキストで使用する必要がある場合は、
メソッドを約束に包むことができます。例は次のとおりです。
requestIdleCallback
バックエンドタスクAPIのいくつかのユースケースは何ですか?
window.requestIdleCallback(() => { // 您的后台任务在此处 });
以上がJavaScriptでバックグラウンドタスクをスケジュールする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











Pythonは、スムーズな学習曲線と簡潔な構文を備えた初心者により適しています。 JavaScriptは、急な学習曲線と柔軟な構文を備えたフロントエンド開発に適しています。 1。Python構文は直感的で、データサイエンスやバックエンド開発に適しています。 2。JavaScriptは柔軟で、フロントエンドおよびサーバー側のプログラミングで広く使用されています。

Web開発におけるJavaScriptの主な用途には、クライアントの相互作用、フォーム検証、非同期通信が含まれます。 1)DOM操作による動的なコンテンツの更新とユーザーインタラクション。 2)ユーザーエクスペリエンスを改善するためにデータを提出する前に、クライアントの検証が実行されます。 3)サーバーとのリフレッシュレス通信は、AJAXテクノロジーを通じて達成されます。

現実世界でのJavaScriptのアプリケーションには、フロントエンドとバックエンドの開発が含まれます。 1)DOM操作とイベント処理を含むTODOリストアプリケーションを構築して、フロントエンドアプリケーションを表示します。 2)node.jsを介してRestfulapiを構築し、バックエンドアプリケーションをデモンストレーションします。

JavaScriptエンジンが内部的にどのように機能するかを理解することは、開発者にとってより効率的なコードの作成とパフォーマンスのボトルネックと最適化戦略の理解に役立つためです。 1)エンジンのワークフローには、3つの段階が含まれます。解析、コンパイル、実行。 2)実行プロセス中、エンジンはインラインキャッシュや非表示クラスなどの動的最適化を実行します。 3)ベストプラクティスには、グローバル変数の避け、ループの最適化、constとletsの使用、閉鎖の過度の使用の回避が含まれます。

PythonとJavaScriptには、コミュニティ、ライブラリ、リソースの観点から、独自の利点と短所があります。 1)Pythonコミュニティはフレンドリーで初心者に適していますが、フロントエンドの開発リソースはJavaScriptほど豊富ではありません。 2)Pythonはデータサイエンスおよび機械学習ライブラリで強力ですが、JavaScriptはフロントエンド開発ライブラリとフレームワークで優れています。 3)どちらも豊富な学習リソースを持っていますが、Pythonは公式文書から始めるのに適していますが、JavaScriptはMDNWebDocsにより優れています。選択は、プロジェクトのニーズと個人的な関心に基づいている必要があります。

開発環境におけるPythonとJavaScriptの両方の選択が重要です。 1)Pythonの開発環境には、Pycharm、Jupyternotebook、Anacondaが含まれます。これらは、データサイエンスと迅速なプロトタイピングに適しています。 2)JavaScriptの開発環境には、フロントエンドおよびバックエンド開発に適したnode.js、vscode、およびwebpackが含まれます。プロジェクトのニーズに応じて適切なツールを選択すると、開発効率とプロジェクトの成功率が向上する可能性があります。

CとCは、主に通訳者とJITコンパイラを実装するために使用されるJavaScriptエンジンで重要な役割を果たします。 1)cは、JavaScriptソースコードを解析し、抽象的な構文ツリーを生成するために使用されます。 2)Cは、Bytecodeの生成と実行を担当します。 3)Cは、JITコンパイラを実装し、実行時にホットスポットコードを最適化およびコンパイルし、JavaScriptの実行効率を大幅に改善します。

JavaScriptは、Webサイト、モバイルアプリケーション、デスクトップアプリケーション、サーバー側のプログラミングで広く使用されています。 1)Webサイト開発では、JavaScriptはHTMLおよびCSSと一緒にDOMを運用して、JQueryやReactなどのフレームワークをサポートします。 2)ReactNativeおよびIonicを通じて、JavaScriptはクロスプラットフォームモバイルアプリケーションを開発するために使用されます。 3)電子フレームワークにより、JavaScriptはデスクトップアプリケーションを構築できます。 4)node.jsを使用すると、JavaScriptがサーバー側で実行され、高い並行リクエストをサポートします。
