Sejauh yang saya tahu, pekerja web harus ditulis dalam file JavaScript terpisah, dan dipanggil seperti ini:
new Worker('longrunning.js')
Saya menggunakan kompilator penutupan untuk menggabungkan dan mengurangi semua kode sumber JavaScript saya, dan saya lebih suka tidak perlu pekerja saya di file terpisah untuk distribusi. Apakah ada cara untuk melakukan ini?
new Worker(function() {
//Long-running work here
});
Mengingat bahwa fungsi kelas satu sangat penting untuk JavaScript, mengapa cara standar untuk melakukan pekerjaan latar belakang harus memuat seluruh file JavaScript lain dari server web?
javascript
web-worker
Ben Dilts
sumber
sumber
var worker = new DynWorker(); worker.inject("foo", function(){...});
...Jawaban:
http://www.html5rocks.com/en/tutorials/workers/basics/#toc-inlineworkers
Contoh lengkap dari pekerja inline BLOB:
sumber
Solusi html5rocks menanamkan kode pekerja web dalam HTML cukup mengerikan.
Dan gumpalan JavaScript-as-a-string yang lolos tidak lebih baik, paling tidak karena mempersulit alur kerja (Compiler Closure tidak dapat beroperasi pada string).
Secara pribadi saya sangat suka metode toString, tapi @ dan-man regex ITU!
Pendekatan pilihan saya:
Dukungan adalah persimpangan dari tiga tabel ini:
Ini tidak akan berfungsi untuk SharedWorker , karena URL harus sama persis, bahkan jika parameter 'nama' opsional cocok. Untuk SharedWorker, Anda memerlukan file JavaScript terpisah.
Pembaruan 2015 - Singularitas ServiceWorker tiba
Sekarang ada cara yang lebih kuat untuk menyelesaikan masalah ini. Sekali lagi, simpan kode pekerja sebagai fungsi, (bukan string statis) dan konversikan menggunakan .toString (), lalu masukkan kode ke dalam CacheStorage di bawah URL statis pilihan Anda.
Ada dua kemungkinan mundur. ObjectURL seperti di atas, atau lebih tepatnya, menempatkan a file JavaScript nyata di /my_workers/worker1.js
Keuntungan dari pendekatan ini adalah:
sumber
Anda dapat membuat satu file JavaScript yang mengetahui konteks eksekusi dan dapat bertindak sebagai skrip induk dan pekerja. Mari kita mulai dengan struktur dasar untuk file seperti ini:
Seperti yang Anda lihat, skrip berisi semua kode untuk sudut pandang orang tua dan pekerja, memeriksa apakah instans individualnya adalah seorang pekerja
!document
.script_path
Komputasi yang agak sulit digunakan untuk secara akurat menghitung jalur skrip relatif terhadap halaman induk, karena jalur yang disediakannew Worker
relatif terhadap halaman induk, bukan skrip.sumber
Dengan menggunakan
Blob
metode ini, bagaimana dengan ini untuk pabrik pekerja:Jadi Anda bisa menggunakannya seperti ini ...
EDIT:
Saya baru saja memperluas ide ini lebih lanjut untuk membuatnya lebih mudah untuk melakukan komunikasi cross-thread: bridged-worker.js .
EDIT 2:
Tautan di atas adalah ke intisari yang saya buat. Orang lain kemudian mengubahnya menjadi repo yang sebenarnya .
sumber
Pekerja web beroperasi dalam konteks yang sepenuhnya terpisah sebagai Program individual.
Ini berarti bahwa kode tidak dapat dipindahkan dari satu konteks ke konteks lain dalam bentuk objek, karena mereka kemudian dapat mereferensikan objek melalui penutupan milik konteks lain.
Ini sangat penting karena ECMAScript dirancang untuk menjadi bahasa utas tunggal, dan karena pekerja web beroperasi di utas terpisah, Anda kemudian akan berisiko operasi yang tidak aman dilakukan.
Ini lagi berarti bahwa pekerja web perlu diinisialisasi dengan kode dalam bentuk sumber.
Spesifikasi dari WHATWG mengatakan
tetapi sayangnya itu tidak benar-benar menjelaskan mengapa seseorang tidak bisa membiarkan melewati string dengan kode sumber ke konstruktor.
sumber
cara yang lebih baik untuk membaca bagi pekerja inline ..
sumber
toString()
, mengekstrak tubuh dan kemudian memasukkannya ke dalam Gumpalan. Periksa jawaban terakhir, saya punya contohMengambil respons Adria dan menempatkannya dalam fungsi copy-pastable yang bekerja dengan Chrome dan FF saat ini tetapi tidak dengan IE10 (pekerja dari gumpalan menyebabkan kesalahan keamanan ).
Dan inilah contoh yang berfungsi http://jsfiddle.net/ubershmekel/YYzvr/
sumber
Jawaban terakhir (2018)
Anda dapat menggunakan Greenlet :
Contoh:
sumber
Tergantung pada kasus penggunaan Anda, Anda dapat menggunakan sesuatu seperti
Contohnya adalah
sumber
Lihatlah plugin vkThread. Dengan plugin htis Anda dapat mengambil fungsi apa pun dalam kode utama Anda dan menjalankannya di utas (pekerja web). Jadi, Anda tidak perlu membuat "file pekerja web" khusus.
http://www.eslinstructor.net/vkthread/
--Adim
sumber
Anda dapat menggunakan pekerja web di javascript yang sama menggunakan inwork web inline.
Artikel di bawah ini akan membahas Anda untuk dengan mudah memahami webworkers dan batasannya serta debugging webworkers.
Menguasai pekerja web
sumber
Saya pikir cara yang lebih baik untuk melakukan ini adalah menggunakan objek Blob, di bawah ini Anda dapat melihat contoh sederhana.
sumber
Coba gunakan jThread. https://github.com/cheprasov/jThread
sumber
di sini konsol:
sumber
https://developer.mozilla.org/es/docs/Web/Guide/Performance/Using_web_workers
sumber
Gunakan plugin kecil saya https://github.com/zevero/worker-create
sumber
Jadi saya pikir kami memiliki opsi keren lain untuk ini sekarang, terima kasih untuk templat literal di ES6. Itu memungkinkan kita untuk membuang fungsi pekerja tambahan (dan ruang lingkup yang aneh) dan hanya menulis kode yang dimaksudkan untuk pekerja sebagai teks multiline, seperti halnya kasus yang kami gunakan untuk menyimpan teks, tetapi tanpa benar-benar membutuhkan dokumen atau DOM untuk melakukannya. Contoh:
Inilah inti dari sisa pendekatan itu .
Perhatikan bahwa kita dapat menarik dependensi fungsi tambahan apa pun yang kita inginkan ke dalam pekerja hanya dengan mengumpulkan mereka ke dalam array dan menjalankan .toString pada masing-masing untuk mengurangi mereka menjadi string juga (harus bekerja selama mereka adalah deklarasi fungsi) dan kemudian hanya menambahkannya ke skrip string. Dengan begitu kita tidak perlu mengimpor Script yang mungkin sudah kita bundel ke dalam lingkup kode yang kita tulis.
Satu-satunya downside nyata untuk versi khusus ini adalah bahwa linter tidak akan dapat lint kode pekerja layanan (karena itu hanya string), yang merupakan keuntungan untuk "pendekatan fungsi pekerja terpisah."
sumber
Ini hanya tambahan di atas - Saya punya template yang bagus untuk menguji pekerja web di jsFiddle. Daripada Blob ia menggunakan
?js
api jsFiddles :Templat web pekerja normal dan templat pekerja bersama tersedia.
sumber
Saya menemukan bahwa CodePen saat ini tidak menggunakan
<script>
tag inline sintaks-highlight yang bukantype="text/javascript"
(atau yang tidak memiliki atribut tipe).Jadi saya menemukan solusi serupa tetapi sedikit berbeda menggunakan blok berlabel dengan
break
, yang merupakan satu-satunya cara Anda dapat menebus dari<script>
tag tanpa membuat fungsi pembungkus (yang tidak perlu).sumber
Versi yang dijanjikan sederhana,,
Function#callAsWorker
yang mengambil thisArg dan argumen (sama seperticall
), dan mengembalikan janji:sumber
close()
metode untuk menutup kait kehidupan pekerja web Anda. developer.mozilla.org/en-US/docs/Web/API/WorkerGlobalScope/…close
fungsinya sudah usang. Namun, pekerja dapat diberhentikan . Saya telah menambahkan itu sekarang.Saya menggunakan kode seperti ini, Anda dapat mendefinisikan onmessage Anda sebagai fungsi selain teks biasa, sehingga editor dapat menyoroti kode Anda dan jshint berfungsi.
sumber
Ya, itu mungkin, saya melakukannya menggunakan file Blob dan meneruskan panggilan balik
Saya akan menunjukkan kepada Anda apa yang dilakukan kelas yang saya tulis dan bagaimana mengelola eksekusi callback di latar belakang.
Pertama, Anda instantiate
GenericWebWorker
dengan data apa pun yang ingin Anda sampaikan ke panggilan balik yang akan dijalankan diWeb Worker
, yang mencakup fungsi yang ingin Anda gunakan, dalam hal ini angka, tanggal dan fungsi yang disebutblocker
Fungsi pemblokir ini akan mengeksekusi infinite while selama n miliseconds
dan kemudian Anda menggunakannya seperti ini
sumber
Anda dapat menempatkan konten file worker.js Anda di dalam backticks (yang memungkinkan konstanta string multiline) dan membuat pekerja dari gumpalan seperti ini:
Ini berguna jika karena alasan apa pun Anda tidak ingin memiliki tag skrip terpisah untuk pekerja.
sumber
Solusi lain adalah hanya dengan membungkus Pekerja dalam suatu fungsi, kemudian membuat gumpalan yang memanggil fungsi seperti:
sumber
One-liner untuk menjalankan fungsi pada pekerja:
Contoh penggunaan:
sumber