2013-09-21 57 views
9

Tôi đang cố gắng tìm ra cách để các khách hàng SockJS của tôi kết nối lại với máy chủ nếu nó bị hỏng.SockJS Client tự động kết nối lại?

Tôi hiện có này:

new_conn = function() {  
     socket = new SockJS(protocol + serverDomain + '/echo', null, { 
      'protocols_whitelist': ['websocket', 'xdr-streaming', 'xhr-streaming', 'iframe-eventsource', 'iframe-htmlfile', 'xdr-polling', 'xhr-polling', 'iframe-xhr-polling', 'jsonp-polling'] 
     }); 
    }; 

    socket.onopen = function() { 
     clearInterval(recInterval); 
    }; 

    socket.onclose = function() {  
     recInterval = window.setInterval(function() { 
      new_conn(); 
     }, 2000); 
    }; 

Vấn đề là các setInterval giữ bắn ngay cả sau khi kết nối lại thành công. Dường như socket.onopen không bao giờ được thực thi.

Bất kỳ ý tưởng nào tôi có thể làm sai?

+2

trong trường hợp của bạn, sử dụng setTimeout() nên tốt hơn so với setInterval() – Fielding34

+0

@ Fielding34 Thật sự tôi nghĩ rằng nó là hoàn toàn ngược lại - 'setInterval()' là tốt hơn bởi vì OP muốn giữ cố gắng (trong khi máy chủ bị hỏng) cho đến khi nó kết nối – TMG

Trả lời

10

Tôi nghĩ rằng nó có thể liên quan đến phạm vi biến. Hãy thử điều này:

var recInterval = null; 

new_conn = function() {  
    socket = new SockJS(protocol + serverDomain + '/echo', null, { 
     'protocols_whitelist': ['websocket', 'xdr-streaming', 'xhr-streaming', 'iframe-eventsource', 'iframe-htmlfile', 'xdr-polling', 'xhr-polling', 'iframe-xhr-polling', 'jsonp-polling'] 
    }); 
}; 

socket.onopen = function() { 
    clearInterval(recInterval); 
}; 

socket.onclose = function() {  
    recInterval = window.setInterval(function() { 
     new_conn(); 
    }, 2000); 
}; 

Dù sao, nó là lạ, bởi vì bạn đã tuyên bố recInterval trên đối tượng window, và nó cần phải có hiệu quả. Nếu nó không hoạt động, bạn cũng có thể gỡ lỗi bằng trình duyệt, với câu lệnh debugger; hoặc tương tác bằng cách đặt các điểm ngắt địa phương ... (ví dụ: onopen).

Bằng cách này, tôi rewrited toàn bộ mã như thế này (tôi thích refactoring :):

var recInterval = null; 
var socket = null; 

var new_conn = function() {  
    socket = new SockJS(protocol + serverDomain + '/echo', null, { 
     'protocols_whitelist': ['websocket', 'xdr-streaming', 'xhr-streaming', 
           'iframe-eventsource', 'iframe-htmlfile', 
           'xdr-polling', 'xhr-polling', 'iframe-xhr-polling', 
           'jsonp-polling'] 
    }); 

    socket.onopen = function() { 
     clearInterval(recInterval); 
    }; 

    socket.onclose = function() {  
     recInterval = setInterval(function() { 
      new_conn(); 
     }, 2000); 
    }; 
}; 
6

Trong trường hợp ai vẫn còn quan tâm đến chủ đề này: Đoạn mã refactored từ franzlorenzon gây ra rất nhiều kết nối lại từ nó là loại đệ quy kết nối lại chính nó bằng cách nào đó vì mỗi hai giây một sự kiện onclose mới được sinh ra (bất kể recInterval).

Di chuyển khoảng thời gian rõ ràng ngay sau khi tạo ổ cắm thực hiện thủ thuật. Tôi cũng đã thêm một socket = null trong sự kiện onclose.

var recInterval = null; 
 
var socket = null; 
 

 
var new_conn = function() { 
 
    socket = new SockJS(protocol + serverDomain + '/echo', null, { 
 
    'protocols_whitelist': ['websocket', 'xdr-streaming', 'xhr-streaming', 
 
     'iframe-eventsource', 'iframe-htmlfile', 
 
     'xdr-polling', 'xhr-polling', 'iframe-xhr-polling', 
 
     'jsonp-polling' 
 
    ] 
 
    }); 
 

 
    clearInterval(recInterval); 
 

 
    socket.onopen = function() { 
 

 
    }; 
 

 
    socket.onclose = function() { 
 
    socket = null; 
 
    recInterval = setInterval(function() { 
 
     new_conn(); 
 
    }, 2000); 
 
    }; 
 
};

+1

Cảm ơn bạn đã chia sẻ điều này. Nó cũng có thể là tốt đẹp để có một giao thức back-off, nơi thời gian giữa các nỗ lực tái kết nối tăng lên. Sau đó, thả thời gian kết nối lại nếu người dùng "thất vọng" bằng cách theo dõi cuộn trong ứng dụng. Rõ ràng họ sẽ kích hoạt một nỗ lực kết nối lại chỉ bằng cách tải lại trang. – coding

+0

@coding Có bạn đúng. Đoạn mã trên chỉ là một ví dụ sửa lỗi từ ví dụ trước. Chúng tôi đang sử dụng một giải pháp như bạn đã đề xuất trên các hệ thống sản xuất của chúng tôi và nó hoạt động tốt. Ngoài ra tôi đang sử dụng một giải pháp tương tự cho các dự án tư nhân. Không có biến chứng là tốt. :) – daPhantom

Các vấn đề liên quan