javascript - Ekstensi Safari: Kegagalan koneksi WebSocket memanggil onclose dan bukan onerror serta tidak ada pengecualian
Saya sedang menulis ekstensi browser untuk Firefox, Chrome, dan Safari. Saat mencoba terhubung ke server WebSocket menggunakan Ekstensi Safari di mana TIDAK ada server yang mendengarkan pada port tertentu, ekstensi Safari saya tidak melemparkan pengecualian, juga tidak memanggil onerror. Sebaliknya, handler onclose dari ekstensi Safari yang dipanggil. Saya juga melihat pesan ini di konsol:
[Error] WebSocket network error: The operation couldn’t be completed. Connection refused (global.html, line 0)
Di Firefox dan Chrome, sepertinya menanganinya dengan benar sejauh yang saya tahu dan memanggil onerror.
Saya hanya melakukan sesuatu seperti ini:
var socket = new WebSocket('ws://127.0.0.1:'+inPort, inHandlerName);
socket.binaryType = "arraybuffer";
kemudian deklarasikan handler untuk onopen, onclose, onerror, dan onmessage. inPort adalah 9000 dan inHandlerName adalah string seperti "global-handler". Saya menaruh handler pengecualian di setiap handler WebSocket dan juga di fungsi yang memiliki kode yang membuat WebSocket, tetapi saya tidak melihat ada pengecualian yang tertangkap.
Apakah ini masalah yang dikenal? Apakah ada cara untuk mengetahui jika koneksi gagal?
Edit: Ini juga terjadi di halaman web sederhana di Safari:
var theSocket = new WebSocket('ws://127.0.0.1:9000', 'global-message');
theSocket.onopen = function()
{
console.log("onopen");
};
theSocket.onerror = function()
{
console.log("onerror");
};
theSocket.onmessage = function()
{
console.log("onmessage");
};
theSocket.onclose = function()
{
console.log("onclose");
};
Jawaban #1
Ini sepertinya bukan cara yang seharusnya bekerja, tetapi dalam pesan onclose, saya mendapatkan parameter event seperti ini:
theSocket.onclose = function(event)
dan event tersebut berisi sebuah field yang disebut code. Ketika saya tidak bisa terhubung ke server, nilai code adalah 1006. Saat ini saya sudah memperbaikinya sehingga memeriksa apakah sedang dijalankan di Safari dan kemudian memeriksa:
if(event.code == 1006)
dan jika demikian, saya akan melakukan pemrosesan yang sama seperti yang saya lakukan dalam kasus kesalahan untuk Firefox dan Chrome.
