2009-08-14 18 views
5

Có cách nào để xóa bỏ responseText của đối tượng XHR mà không phá hủy đối tượng XHR không?Sao chổi, responseText và sử dụng bộ nhớ

Tôi cần giữ kết nối liên tục mở cho máy chủ web để cấp dữ liệu trực tiếp vào trình duyệt. Vấn đề là, có một lượng dữ liệu tương đối lớn đi qua (vài trăm K mỗi giây liên tục), do đó việc sử dụng bộ nhớ là một vấn đề lớn, bởi vì kết nối này phải mở trong ít nhất vài phút. responseText rất lớn rất nhanh, mặc dù JSON tôi gửi lại đã được crunched nhỏ như nó có thể nhận được. Do cách ứng dụng phía máy chủ hoạt động, nếu tôi sử dụng tính năng bỏ phiếu ngắn kiểu AJAX và chỉ phá hủy đối tượng XHR khi tôi hoàn thành nó, tôi bỏ lỡ một lượng đáng kể dữ liệu quan trọng ngay cả trong vài phần nghìn giây cần phân tích phản hồi, tạo XHR mới và gửi đi. Tôi không có tùy chọn để sử dụng các yêu cầu chồng chéo, vì máy chủ web chỉ chấp nhận một kết nối tại một thời điểm. (Đừng hỏi.) Vì vậy, Comet chính là mô hình tôi cần.

Điều tôi muốn làm là phân tích từng đoạn JSON khi nó trở lại từ máy chủ và sau đó xóa hết câu trả lời để tôi có thể tiếp tục sử dụng cùng một kết nối. Tuy nhiên, responseText là chỉ đọc. Nó không thể trực tiếp làm trống bằng bất kỳ phương pháp nào tôi đã tìm thấy.

Có một phần của hình ảnh tôi thiếu ở đây không? Có ai biết bất kỳ thủ thuật tôi có thể sử dụng để giải phóng responseText khi tôi đọc xong nó? Hoặc là có một nơi khác các phản ứng máy chủ có thể đi?

Tôi không bao gồm mã vì đây thực sự gần như là một câu hỏi bất khả tri về mã. Các thói quen Javascript để sinh ra các XHR và xử lý dữ liệu trả về rất, rất đơn giản.

Trả lời

1

Đó chỉ là công việc bỏ phiếu dài. Bạn giữ một chỉ mục vào số dòng cuối cùng đọc và với mỗi đánh dấu của khoảng thời gian của bạn đọc từ thời điểm đó trở đi. Đó là một kết nối dài, do đó một phản ứng dài.

responseText mới có nghĩa là kết nối mới. Nhưng sau đó nó sẽ không còn là sao chổi nữa;)

+0

Cảm ơn. Tôi hiểu mô hình. Tôi đã chỉ hy vọng có một cách để duy trì kết nối mà không bị buộc phải lưu trữ tất cả mọi thứ đã từng nhận được trên kết nối đó trong một bộ đệm lớn. Việc bỏ phiếu dài là một sự cố dù sao, vì vậy tôi đoán nó đòi hỏi rất nhiều để nó hoạt động chính xác theo cách tôi cần :) – glomad

+1

@ithcy: nó thực sự có vẻ giống như một yêu cầu hợp lý. Tôi chưa bao giờ nghĩ về nó nhiều cho đến khi bạn hỏi. Một 'xhr.flushResponseBuffer()' hoặc một cái gì đó có thể có giá trị cho các kết nối chạy dài, và sẽ tiết kiệm phải lưu một tham chiếu số dòng chết tiệt tất cả các thời gian. –

4

Trái ngược với phản ứng khác, "bỏ phiếu dài" không phải là một kết nối dài. "Long-polling" là nhiều kết nối theo thứ tự, mỗi kết nối được thiết lập để duy trì kết nối trong một khoảng thời gian hợp lý nếu không cần đáp ứng. Họ làm hết giờ (thường khoảng 25-30 giây) và sau đó thiết lập lại kết nối mới. Vì HTTP1.1 cho phép tái sử dụng các kết nối hiện có, kết nối không phải được thương lượng lại và do đó có thể được thiết lập lại gần như ngay lập tức.

Vì vậy, chỉ cần sử dụng nhiều yêu cầu. Vì thực sự có chi phí không đáng kể để thiết lập lại kết nối và mỗi kết nối mới sẽ cho phép bạn hủy văn bản phản hồi trước đó, đây là giải pháp khả thi hoàn hảo từ góc nhìn hiệu suất/trên không và cũng sẽ giải quyết vấn đề bộ nhớ của bạn.

[Chỉnh sửa] Tôi đang nói từ kinh nghiệm, là một trong những tác giả của WebSync.