Tôi có ứng dụng AJAX cập nhật trang dựa trên phản hồi của máy chủ. Lệnh mà phản hồi của máy chủ AJAX dựa trên thời gian dài để tạo ra phản hồi đầy đủ, nhưng nó sẽ gửi một phần thông tin ngay sau khi nó được tính toán. Phản hồi một phần/thông tin một phần này được gửi trong "bùng nổ", và thời gian và kích thước của mỗi cụm là không thể đoán trước. CGI script (trong Perl) mà dòng lệnh đầu ra cho trình duyệt web (yêu cầu AJAX) đã bật tự động bật.Xử lý phản hồi máy chủ gia tăng trong AJAX (bằng JavaScript)
Phản hồi của máy chủ dựa trên đầu ra của lệnh bên ngoài. Trong khi 'time cmd>/dev/null' trung bình khoảng 10,0 giây, 'time cmd | head>/dev/null' cho ít hơn 0,1 giây (ví dụ dữ liệu) .Tất cả dữ liệu là kết quả của cuộc gọi đơn tới lệnh bên ngoài này .
tình hình trông giống như sau (sơ đồ ASCII-art sau):
client | | server
--------- ---------
request -\
\
\
\
\->
/- response
/ .
/ .
//- .
<-// .
/ .
//- [end]
<-//
/
/
<-/
tôi có một số câu hỏi về vấn đề này
Lưu ý:. phía máy chủ được thực hiện như CGI kịch bản trong Perl, và tôi muốn xem (cũng) giải pháp mà không có u hát thư viện/khung công tác JavaScript như jQuery.
Đầu ra của lệnh được sử dụng bởi phía máy chủ của ứng dụng AJAX dựa trên dòng. Mỗi nhóm dòng, bắt đầu bằng một loại dòng được xác định và kết thúc bằng một loại dòng khác, bao gồm dữ liệu độc lập và không thể thay đổi. Tôi có nên gửi phản hồi từ một lệnh dưới dạng 'text/plain' và xử lý JavaScript trên phía máy khách hay tôi nên xử lý trước dữ liệu trên máy chủ và gửi toàn bộ khối dữ liệu bằng JSON bằng cách sử dụng 'application/json' mimetype?
Có thể xảy ra rằng một lượng lớn dữ liệu được gửi cùng một lúc bởi máy chủ được theo sau bởi một đoạn dữ liệu khác. Làm thế nào để đối phó với tình huống khi xử lý
onreadystatechange
được gọi trong khi lời gọi trước đó đã không hoàn thành công việc? Tôi có nên sử dụng biến toàn cầu như semaphore, hoặc vượt qua biến trạng thái như tham số xử lý (tốt, sử dụngxhr.onreadystatechange = function() { handleRequest(xhr, state) }
)?Tôi có nên sử dụng 'text/plain' hoặc 'application/json' hoặc có thể 'multipart/x0mixed-replace' cho điều này không? Lưu ý: ứng dụng này sẽ hoạt động trong (alomst) bất kỳ trình duyệt nào.
Làm cách nào để xử lý trình duyệt web (JavaScript engine) chỉ gọi trênReadyStateChange sau khi nhận được phản hồi hoàn chỉnh (vì vậy tôi không thấy
xhr.readyState == 3
tức là một phần phản hồi nhiều lần)? Vâng, bên cạnh việc sử dụng một số khung JavaScript.Cách xử lý các phản hồi không đầy đủ (trong trường hợp này có nghĩa là các dòng không hoàn chỉnh).
Tôi có nên gửi kết thúc điểm đánh dấu phản hồi hoặc dựa vào bộ đếm để kiểm tra xem chúng tôi đã nhận được tất cả dữ liệu hay tôi có thể chỉ dựa vào phát hiện
xhr.readyState == 4
?
Ngay cả phản ứng một phần cũng sẽ hữu ích.
Vấn đề với yêu cầu lặp lại AJAX (chiến lược bỏ phiếu dài) là dữ liệu được tạo bởi lệnh _single_, vì vậy phần máy chủ của AJAX sẽ phải lưu trạng thái máy khách/ghi trạng thái/ghi để gửi thêm yêu cầu. –