Konteks
Sebuah game dikirimkan sebagai aplikasi web progresif yang memiliki penghitung waktu ( setTimeout
, setInterval
) dan websocket untuk mendapatkan komunikasi waktu nyata.
Apa yang terjadi
Semuanya baik-baik saja selama pengguna tetap di aplikasi. Tetapi ketika pengguna pergi ke tab lain, atau aplikasi lain atau mematikan layar (jika ponsel), itu menjadi "dunia tidak dikenal yang jahat".
- Soket web mungkin atau mungkin tidak menjadi "dijeda" atau "dimatikan"
- Pengatur waktu terlihat seperti dicekik atau dilemahkan.
Perilaku ini tampaknya tergantung pada browser dan platform dan, mungkin, bahkan tergantung pada perilaku pengguna tertentu. Saya kira browser dan OS memiliki siklus / mekanisme sendiri untuk menghemat baterai dan / atau komputasi.
Ketika pengguna kembali, aplikasi berada dalam kondisi yang tidak diketahui dan saya berjuang untuk memulihkan keadaan dengan benar.
Mengenai websockets saya memiliki koneksi ulang otomatis dengan socket.io dan menghubungkan kembali-websocket tetapi tidak cukup untuk menyelesaikan semuanya.
Mencari jawaban
- Apa "siklus hidup" dari berbagai browser tentang ini? Apakah ini didokumentasikan? Kapan mereka memutuskan untuk mematikan dan mencekik?
- Apa yang mereka lakukan persis ke soket web? Browser baru saja memutusnya?
- Apa yang mereka lakukan tepat pada timer? Mereka mencekik mereka atau melonggarkan mereka atau sesuatu yang lain?
- Apa yang terjadi pada eksekusi javascript secara umum? Dijeda / dihancurkan / dicekik?
- Apakah ada cara untuk menghubungkan ke beberapa jenis siklus hidup browser saat itu akan mematikan segalanya? Satu-satunya hal yang bisa saya temukan adalah API visibilitas
Apakah ada cara untuk mereproduksi perilaku ini secara artifisial untuk dapat menguji solusi? Ini sangat sulit di desktop. Soket web tidak dapat dimatikan dan pengembang kromium tampaknya tidak terburu-buru untuk membantu masalah mulai 2014 (!): Soket web tidak disertakan saat menggunakan penghambat koneksi
Terlepas dari hal di atas, apakah ada solusi lintas-browser pragmatis untuk mendeteksi / menyelesaikan masalah ini? (misalnya dari pengalaman, Firefox di desktop tampaknya berperilaku sangat berbeda dibandingkan dengan Chrome, dan iPhone akan terputus jauh lebih sering daripada Android)
tautan yang berhubungan
Jawaban:
Tidak yakin, tetapi Anda bisa menggunakan pekerja layanan. Seperti yang saya tahu, mereka berjalan di latar belakang bahkan jika tab Anda tidak dibuka dan dihentikan jika tab Anda ditutup.
Btw. siklus hidup tab browser tampaknya berbeda di setiap browser, karena setiap browser menanganinya berbeda. Dari apa yang saya lihat bahwa browser dapat membekukan tab jika browser membutuhkan lebih banyak memori untuk hal-hal lain.
Ini dokumen dari Chrome .
Saya ingat ada beberapa peristiwa, seperti onload yang memberi tahu Anda jika pengguna telah meninggalkan atau membuka kembali tab. Anda dapat menggunakan acara ini untuk menghubungkan kembali dll.
sumber
console.log()
ketika Anda mendapatkan pesan dari server ws. Di chrome, Anda dapat membuka konsol pekerja layanan Anda sehingga Anda dapat menguji apakah pesan-pesan itu dihidupkan kembali ketika Anda meninggalkan tab.Saya akan memberikan saran berbeda tentang cara mendesain aplikasi Anda. Dari apa yang saya pahami, maksud Anda adalah menambahkan lebih banyak logika untuk memahami jika pengguna tidak lagi aktif di browser. Ini memerlukan masalah berbeda yaitu browser spesifik untuk mengimplementasikan logika itu. Dengan pemikiran itu, saya akan berinvestasi dalam memiliki penanganan kesalahan yang lebih baik , baik di server dan klien.
Kesalahan tidak akan spesifik peramban. Menangani itu akan membuat aplikasi Anda lebih tangguh dan agnostik terhadap perubahan peramban, yang pada akhirnya bisa berubah, katakanlah, cara mereka hibernasi tab, fitur lain yang mungkin diterapkan vendor di masa depan.
Ini adalah gagasan yang dapat Anda temukan dalam arsitektur layanan, tetapi pola yang sama berlaku untuk aplikasi web apa pun. Anda mungkin ingin mencari
Design-for-Fail
konsep:https://www.oreilly.com/library/view/designing-delivery/9781491903742/ch04.html
sumber