ホームページ ウェブフロントエンド jsチュートリアル JavaScript のスケジュールされたタスクを実行する方法 (background_javascript のヒント)

JavaScript のスケジュールされたタスクを実行する方法 (background_javascript のヒント)

May 16, 2016 pm 03:24 PM

即使忘了 JavaScript 的一切知識,也不會忘記:它是阻塞的。

想像一下,你的瀏覽器裡住著一個魔法小精靈,負責瀏覽器的正常運作。不論渲染 HTML,回應選單指令,螢幕渲染,處理滑鼠點擊,或執行 JavaScript 函數,所有事情都歸一個小精靈處理。它哪忙得過來,一次只能處理一件事情。如果同時丟給它一堆任務,它會列出一個長長的待辦列表,按順序完成它們。

人們常常希望初始化元件和事件處理的 JavaScript 可以盡快執行。可是,有些較不重要的後台任務不會直接影響使用者體驗,例如:

記錄統計

發送資料到社群網路(或新增『分享'按鈕)

預先載入內容

預處理或預先渲染 HTML

他們對時序要求不嚴格,但是為了讓頁面仍然回應,直到使用者捲動頁面或與內容互動時才執行。

選擇之一是 Web Workers ,它可以在獨立的執行緒同時執行程式碼。用於預先載入和預處理再好不過,但你沒有權限直接存取或更新 DOM。你可以在自己的程式碼中避開這一點,但是無法保證第三方腳本例如 Google Analytics 永遠不需要這個。

另一個選擇是setTimeout,例如setTimeout(doSomething, 1);。一旦其它的立即執行任務執行完畢,瀏覽器將執行doSomething()函數。實際上,它被放到了待辦清單的底部。不幸的是,函數將被調用,而不顧處理需求。

#requestIdleCallback

requestIdleCallback 是新API,當瀏覽器稍作喘息的時候,用來執行不太重要的後台排程任務。 難免讓人想起 requestAnimationFrame ,在下次重繪之前,執行函數更新動畫。 想了解更多戳這裡: 使用 requestAnimationFrame 做簡單的動畫 。

requestIdleCallback特性監控:

if ('requestIdleCallback' in window) {
 // requestIdleCallback supported
 requestIdleCallback(backgroundTask);
}
else {
 // no support - do something else
 setTimeout(backgroundTask1, 1);
 setTimeout(backgroundTask2, 1);
 setTimeout(backgroundTask3, 1);
}
ログイン後にコピー

也可以指定配置參數對象,例如 timeout,

requestIdleCallback(backgroundTask, { timeout: 3000; }); 
ログイン後にコピー

確保函數在3秒內調用,不管瀏覽器是否空閒。

deadline物件傳入下列參數時,requestIdleCallback只執行一次回呼:

didTimeout—— 如果可選的 timeout 觸發,則設定為 true
timeRemaining()—— 函數傳回執行任務剩餘的毫秒數
timeRemaining()最多分配50ms用於任務的執行,超過這個限制,也不會停止任務,但是,最好重新呼叫requestIdleCallback安排進一步的處理。

我們來建立一個簡單的例子,讓幾個任務依序執行。任務的函數引用儲存在數組中:

//待执行的函数数组
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);
 }
}
ログイン後にコピー

#一次 requestIdleCallback 之間不應該做什麼?

Paul Lewis 在 他的文章 中提到,一次 requestIdleCallback 執行的任務應該切成小塊。它不適用於不可預測時間的情況(例如操作 DOM,使用 requestAnimationFrame 回呼會更好)。 resolving(或 rejecting)Promises 時也要謹慎,即使沒有更多的剩餘時間,空閒回調完成之後,回呼函數也會立即執行。

#requestIdleCallback 瀏覽器支援狀況

requestIdleCallback是試驗性特性,規格仍不穩定,碰到 API 變更時不足為奇。 Chrome 47 已支援… 2015年結束前應該可用了。 Opera 應該會跟上。 Microsoft 和 Mozilla 都在考慮 API 是否應該支援 Promises 。 Apple 像往常一樣不鳥。

Paul Lewis(上文提到的)寫了一個簡單的 requestIdleCallback shim ,它可以模擬瀏覽器的空閒監測行為,但不是一個 polyfill( shim 和 polyfill 的區別 )。

requestIdleCallback shim程式碼如下:

/*!
 * Copyright Google Inc. All rights reserved.
 *
 * Licensed under the Apache License, Version . (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-.
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
 * or implied. See the License for the specific language governing
 * permissions and limitations under the License.
 */
/*
 * @see https://developers.google.com/web/updates///using-requestidlecallback
 */
window.requestIdleCallback = window.requestIdleCallback ||
 function (cb) {
  var start = Date.now();
  return setTimeout(function () {
   cb({
    didTimeout: false,
    timeRemaining: function () {
     return Math.max(, - (Date.now() - start));
    }
   });
  }, );
 }
window.cancelIdleCallback = window.cancelIdleCallback ||
 function (id) {
  clearTimeout(id);
 }
ログイン後にコピー

ps: スケジュールされたタスクを実行する方法

1. GPEDIT.MSC を実行します

2. コンピューターの構成を選択します

--- Windows の設定
セキュリティ設定
—ローカル戦略
—-ユーザー権利の割り当て
右側の [ネットワークからこのコンピュータにアクセス] をダブルクリックします
必要なユーザー名をリストに追加します。

3. --- セキュリティ設定

---安全な選択
サーバー オペレーターによるタスクのスケジュールを許可する
をオンにします

4.-----ローカル戦略

--- バッチ ジョブとしてログイン
必要なユーザー名をリストに追加します。

5.-----ローカル戦略

--- コンピューターとユーザーが委任に対して信頼できるようにします
必要なユーザー名をリストに追加します。
管理者ユーザーになることが最善です。

タスク プランを開始できない場合は、プロンプト コード: 0X80041315

解決策: 2 つの可能性があります。1 つは、システムの「タスク スケジューラ」サービスが開始されていないことです。操作中に「services.msc」と入力して、「タスク スケジューラ」サービスが「すでに完了」に設定されているかどうかを確認できます。 「無効」になっている場合は、それをダブルクリックしてスタートアップの種類を「自動」に変更し、スケジュールされたタスクをリセットすると、実行できるようになります。

現在のアカウントが自動的にログインするように設定されており、そのログイン パスワードが空の場合、XP Professional Edition ではタスク プランが時間通りに実行されない可能性があります。これを行うには、「gpedit.msc」を実行する必要があります。グループ ポリシーを編集します。「コンピューターの構成」→「Windows の設定」→「セキュリティの設定」→「ローカル コンピューター ポリシー」→「セキュリティ オプション」を展開し、右側の「アカウント: パスワードが空のローカル アカウントではコンソール ログインのみを許可します」項目をダブルクリックし、「」を選択します。ポップアップダイアログボックスで「無効です」と表示されます。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

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

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

フロントエンドのサーマルペーパーレシートのために文字化けしたコード印刷に遭遇した場合はどうすればよいですか? フロントエンドのサーマルペーパーレシートのために文字化けしたコード印刷に遭遇した場合はどうすればよいですか? Apr 04, 2025 pm 02:42 PM

フロントエンドのサーマルペーパーチケット印刷のためのよくある質問とソリューションフロントエンド開発におけるチケット印刷は、一般的な要件です。しかし、多くの開発者が実装しています...

誰がより多くのPythonまたはJavaScriptを支払われますか? 誰がより多くのPythonまたはJavaScriptを支払われますか? Apr 04, 2025 am 12:09 AM

スキルや業界のニーズに応じて、PythonおよびJavaScript開発者には絶対的な給与はありません。 1. Pythonは、データサイエンスと機械学習でさらに支払われる場合があります。 2。JavaScriptは、フロントエンドとフルスタックの開発に大きな需要があり、その給与もかなりです。 3。影響要因には、経験、地理的位置、会社の規模、特定のスキルが含まれます。

javascriptの分解:それが何をするのか、なぜそれが重要なのか javascriptの分解:それが何をするのか、なぜそれが重要なのか Apr 09, 2025 am 12:07 AM

JavaScriptは現代のWeb開発の基礎であり、その主な機能には、イベント駆動型のプログラミング、動的コンテンツ生成、非同期プログラミングが含まれます。 1)イベント駆動型プログラミングにより、Webページはユーザー操作に応じて動的に変更できます。 2)動的コンテンツ生成により、条件に応じてページコンテンツを調整できます。 3)非同期プログラミングにより、ユーザーインターフェイスがブロックされないようにします。 JavaScriptは、Webインタラクション、シングルページアプリケーション、サーバー側の開発で広く使用されており、ユーザーエクスペリエンスとクロスプラットフォーム開発の柔軟性を大幅に改善しています。

JavaScriptを使用して、同じIDを持つArray要素を1つのオブジェクトにマージする方法は? JavaScriptを使用して、同じIDを持つArray要素を1つのオブジェクトにマージする方法は? Apr 04, 2025 pm 05:09 PM

同じIDを持つ配列要素をJavaScriptの1つのオブジェクトにマージする方法は?データを処理するとき、私たちはしばしば同じIDを持つ必要性に遭遇します...

Shiseidoの公式Webサイトのように、視差スクロールと要素のアニメーション効果を実現する方法は?
または:
Shiseidoの公式Webサイトのようにスクロールするページを伴うアニメーション効果をどのように実現できますか? Shiseidoの公式Webサイトのように、視差スクロールと要素のアニメーション効果を実現する方法は? または: Shiseidoの公式Webサイトのようにスクロールするページを伴うアニメーション効果をどのように実現できますか? Apr 04, 2025 pm 05:36 PM

この記事の視差スクロールと要素のアニメーション効果の実現に関する議論では、Shiseidoの公式ウェブサイト(https://www.shisido.co.co.jp/sb/wonderland/)と同様の達成方法について説明します。

Console.log出力の違い結果:なぜ2つの呼び出しが異なるのですか? Console.log出力の違い結果:なぜ2つの呼び出しが異なるのですか? Apr 04, 2025 pm 05:12 PM

Console.log出力の違いの根本原因に関する詳細な議論。この記事では、Console.log関数の出力結果の違いをコードの一部で分析し、その背後にある理由を説明します。 �...

JavaScriptは学ぶのが難しいですか? JavaScriptは学ぶのが難しいですか? Apr 03, 2025 am 12:20 AM

JavaScriptを学ぶことは難しくありませんが、挑戦的です。 1)変数、データ型、関数などの基本概念を理解します。2)非同期プログラミングをマスターし、イベントループを通じて実装します。 3)DOM操作を使用し、非同期リクエストを処理することを約束します。 4)一般的な間違いを避け、デバッグテクニックを使用します。 5)パフォーマンスを最適化し、ベストプラクティスに従ってください。

PowerPointはJavaScriptを実行できますか? PowerPointはJavaScriptを実行できますか? Apr 01, 2025 pm 05:17 PM

JavaScriptはPowerPointで実行でき、外部JavaScriptファイルを呼び出したり、VBAを介してHTMLファイルを埋め込んだりすることで実装できます。 1. VBAを使用してJavaScriptファイルを呼び出すには、マクロを有効にし、VBAプログラミングの知識を持つ必要があります。 2。JavaScriptを含むHTMLファイルを埋め込みます。これは、シンプルで使いやすいが、セキュリティ制限の対象となります。利点には、拡張機能と柔軟性が含まれますが、欠点にはセキュリティ、互換性、複雑さが含まれます。実際には、セキュリティ、互換性、パフォーマンス、ユーザーエクスペリエンスに注意を払う必要があります。

See all articles