Walaupun anda lupa semua yang anda tahu tentang JavaScript, anda tidak akan lupa: ia menyekat.
Bayangkan bahawa terdapat bunian ajaib yang tinggal dalam penyemak imbas anda, bertanggungjawab untuk operasi biasa penyemak imbas. Sama ada ia memaparkan HTML, bertindak balas kepada arahan menu, memaparkan skrin, mengendalikan klik tetikus atau melaksanakan fungsi JavaScript, semuanya dikendalikan oleh seorang elf. Ia sangat sibuk sehingga ia hanya boleh mengendalikan satu perkara pada satu masa. Jika anda memberikan banyak tugas pada masa yang sama, ia akan membuat senarai tugasan yang panjang dan menyelesaikannya mengikut urutan.
Orang ramai selalunya mahu JavaScript yang memulakan komponen dan pengendali acara dilaksanakan secepat mungkin. Walau bagaimanapun, beberapa tugas latar belakang yang kurang penting tidak menjejaskan pengalaman pengguna secara langsung, seperti:
Rekod statistik
Hantar data ke rangkaian sosial (atau tambah butang 'kongsi')
Kandungan pramuat
Praproses atau prapaparan HTML
Mereka tidak menetapkan masa yang ketat, tetapi agar halaman itu kekal responsif, mereka tidak dilaksanakan sehingga pengguna menatal halaman atau berinteraksi dengan kandungan.
Satu pilihan ialah Pekerja Web, yang boleh melaksanakan kod serentak dalam urutan bebas. Hebat untuk pramuat dan prapemprosesan, tetapi anda tidak mempunyai akses terus atau mengemas kini DOM. Anda boleh mengatasi perkara ini dalam kod anda sendiri, tetapi tiada jaminan bahawa skrip pihak ketiga seperti Google Analitis tidak akan memerlukan ini.
Pilihan lain ialah setTimeout, seperti setTimeout(doSomething, 1);. Sebaik sahaja tugasan segera yang lain telah dilaksanakan, penyemak imbas akan melaksanakan fungsi doSomething(). Malah, ia telah ditolak ke bahagian bawah senarai tugasan. Malangnya, fungsi itu akan dipanggil tanpa mengira keperluan pemprosesan.
#requestIdleCallback
requestIdleCallback ialah API baharu, digunakan untuk melaksanakan tugas berjadual latar belakang yang kurang penting apabila penyemak imbas mengambil nafas. Ia sudah semestinya mengingatkan requestAnimationFrame, yang melaksanakan fungsi untuk mengemas kini animasi sebelum lukisan semula seterusnya. Jika anda ingin mengetahui lebih lanjut, klik di sini: Gunakan requestAnimationFrame untuk membuat animasi mudah.
minta pemantauan ciriIdleCallback:
if ('requestIdleCallback' in window) { // requestIdleCallback supported requestIdleCallback(backgroundTask); } else { // no support - do something else setTimeout(backgroundTask1, 1); setTimeout(backgroundTask2, 1); setTimeout(backgroundTask3, 1); }
Anda juga boleh menentukan objek parameter konfigurasi, seperti tamat masa,
requestIdleCallback(backgroundTask, { timeout: 3000; });
Pastikan fungsi dipanggil dalam masa 3 saat, tidak kira sama ada penyemak imbas melahu.
Apabila objek tarikh akhir melepasi parameter berikut, requestIdleCallback hanya melaksanakan panggilan balik sekali:
didTimeout - Tetapkan kepada benar jika tamat masa pilihan menyala
timeRemaining()—— Fungsi mengembalikan bilangan milisaat yang tinggal untuk melaksanakan tugas
timeRemaining() memperuntukkan sehingga 50ms untuk pelaksanaan tugasan Jika melebihi had ini, tugasan tidak akan dihentikan Walau bagaimanapun, adalah lebih baik untuk memanggil semula requestIdleCallback untuk mengatur pemprosesan selanjutnya.
Mari kita buat contoh mudah untuk melaksanakan beberapa tugasan dalam urutan. Rujukan fungsi tugasan disimpan dalam tatasusunan:
//待执行的函数数组 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); } }
#Apakah yang tidak boleh dilakukan antara requestIdleCallback?
Paul Lewis menyebut dalam artikelnya bahawa tugas yang dilakukan oleh requestIdleCallback harus dipotong menjadi kepingan kecil. Ia tidak sesuai untuk situasi masa yang tidak dapat diramalkan (seperti mengendalikan DOM, lebih baik menggunakan panggilan balik requestAnimationFrame). Juga berhati-hati apabila menyelesaikan (atau menolak) Janji, fungsi panggil balik akan dilaksanakan serta-merta selepas panggilan balik terbiar selesai, walaupun tidak ada masa lagi.
#requestIdleCallback Sokongan Penyemak Imbas
requestIdleCallback ialah ciri percubaan, spesifikasinya masih tidak stabil dan tidak menghairankan untuk menghadapi perubahan API. Chrome 47 disokong...sepatutnya tersedia sebelum penghujung tahun 2015. Opera harus mengikutinya. Kedua-dua Microsoft dan Mozilla sedang mempertimbangkan sama ada API harus menyokong Promises. Apple, seperti biasa, bersikap pesimis.
Paul Lewis (disebutkan di atas) menulis permintaan ringkasIdleCallback shim, yang boleh mensimulasikan gelagat pemantauan terbiar penyemak imbas, tetapi bukan polyfill (perbezaan antara shim dan polyfill).
permintaan kod shimIdleCallback adalah seperti berikut:
/*! * 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: Bagaimana untuk menjalankan tugas yang dijadualkan
1. Jalankan GPEDIT.MSC
2. Pilih konfigurasi komputer
--- Tetapan Windows
Tetapan keselamatan
—Strategi Tempatan
—-Penugasan Hak Pengguna
Klik dua kali Akses komputer ini dari rangkaian di sebelah kanan
Tambahkan nama pengguna yang diperlukan pada senarai.
3. --- Tetapan keselamatan
---Pilihan selamat
Hidupkan Benarkan operator pelayan menjadualkan tugas
4.-----Strategi tempatan
--- Log masuk sebagai kerja kelompok
Tambahkan nama pengguna yang diperlukan pada senarai.
5.-----Strategi tempatan
--- Benarkan komputer dan pengguna dipercayai untuk perwakilan
Tambahkan nama pengguna yang diperlukan pada senarai.
Adalah lebih baik untuk menjadi pengguna pentadbir.
Jika pelan tugas tidak boleh dimulakan, kod gesaan: 0X80041315
Penyelesaian: Terdapat dua kemungkinan Satu ialah perkhidmatan "Penjadual Tugas" dalam sistem Anda boleh menaip "services.msc" semasa operasi untuk menyemak sama ada perkhidmatan "Penjadual Tugas" ditetapkan kepada "Sudah. "Lumpuhkan", jika ya, cuma klik dua kali padanya untuk menukar jenis permulaan kepada "Automatik" dan tetapkan semula tugas yang dijadualkan untuk melaksanakannya.
Jika akaun semasa anda ditetapkan untuk log masuk secara automatik, dan kata laluan log masuknya kosong, ia juga boleh menyebabkan pelan tugasan tidak dapat dilaksanakan tepat pada masanya, anda perlu menjalankan "gpedit.msc" untuk edit dasar kumpulan: kembangkan Konfigurasi "Komputer" → Tetapan Windows → Tetapan Keselamatan → Dasar Komputer Setempat → Pilihan Keselamatan "; dwiklik item "Akaun: Akaun tempatan dengan kata laluan kosong hanya membenarkan log masuk konsol" di sebelah kanan, dan pilih " Dilumpuhkan" dalam kotak dialog pop timbul.