2009-07-20 1 views
6

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ụng xhr.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.

Trả lời

0

Tôi nghĩ rằng phía máy khách có thể được thiết kế để xử lý dữ liệu theo khối, gửi các yêu cầu AJAX lặp lại cho đến khi tất cả các dữ liệu đã được cung cấp. Điều này giả định rằng mỗi đoạn có thể được gửi một cách kịp thời (không có vấn đề thời gian chờ phía máy khách) ngay cả khi toàn bộ phản hồi là lớn; và thiết kế này có lẽ đơn giản hơn việc phát triển kiểm tra các trạng thái phản hồi một phần cụ thể có thể thay đổi từ trình duyệt đến trình duyệt.

Xét về việc bạn xử lý phía máy chủ hay phía máy khách, điều đó sẽ phụ thuộc vào ví dụ: bao nhiêu khách hàng đồng thời bạn sẽ cần dịch vụ và liệu bạn có thể sử dụng bộ nhớ đệm cho bất kỳ phản hồi nào không; trong một số tình huống mà có rất nhiều khách hàng, tốt hơn là chuyển bưu kiện ra một số tải xử lý cho họ (miễn là họ có thể xử lý nó, tất nhiên).

+1

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. –

1

Tôi nghĩ rằng Comet là một phần của những gì bạn cần cho giải pháp của mình. Bạn có thể bổ sung (nếu tôi có quyền) thanh toán Bayeux Protocol do Quỹ Dojo thực hiện. Toàn bộ sự việc vẫn còn rất mới (mặc dù một số điều có thể là có thể với các triển khai HTML5 đầu tiên).

Bên cạnh đó bạn có thể sẽ phải triển khai phương pháp thăm dò ý kiến. Câu hỏi còn lại là, bao nhiêu dữ liệu mà trình thông dịch JavaScript phía máy khách có thể xử lý. Có khả năng nào cho bạn bằng cách nào đó "trang" dữ liệu của bạn để bạn sẽ không có vấn đề yêu cầu xử lý vẫn còn xử lý trong khi phản ứng khác đã đến chưa?