2010-04-03 48 views
5

Tôi có một trang web đơn giản (http://www.kousenit.com/twitterfollowervalue) tính toán số lượng dựa trên người theo dõi trên Twitter của một người. Vì API Twitter chỉ trả về người theo dõi 100 tại một thời điểm, một quá trình hoàn chỉnh có thể liên quan đến nhiều cuộc gọi.Hiển thị tiến trình trong một cuộc gọi Ajax dài

Hiện tại, tôi có một cuộc gọi Ajax đến một phương thức chạy vòng lặp Twitter. Phương thức trông giống như (Groovy):

def updateFollowers() { 
    def slurper = new XmlSlurper() 
    followers = [] 
    def next = -1 
    while (next) { 
     def url = "http://api.twitter.com/1/statuses/followers.xml?id=$id&cursor=$next" 
     def response = slurper.parse(url) 
     response.users.user.each { u -> 
      followers << new TwitterUser(... process data ...) 
     } 
     next = response.next_cursor.toBigInteger() 
    } 
    return followers 
} 

Điều này được gọi từ bộ điều khiển gọi là renderTTFV.groovy. Tôi gọi bộ điều khiển thông qua một cuộc gọi Ajax sử dụng thư viện mẫu:

Trên trang web của tôi, trong phần tiêu đề (JavaScript):

function displayTTFV() { 
    new Ajax.Updater('ttfv','renderTTFV.groovy', {}); 
} 

và có một div trong cơ thể của trang đó cập nhật khi cuộc gọi hoàn tất.

Mọi thứ đều hoạt động, nhưng phương pháp updateFollowers có thể mất một lượng thời gian hợp lý. Có cách nào tôi có thể trả về giá trị tiến bộ không? Ví dụ: tôi muốn cập nhật trang web trên mọi lần lặp lại. Tôi biết trước bao nhiêu lần lặp lại sẽ có. Tôi chỉ không thể tìm ra cách để cập nhật trang ở giữa vòng lặp đó.

Mọi đề xuất sẽ được đánh giá cao.

Trả lời

4

Đối với tiến bộ ít chính xác hơn hoặc báo cáo bạn có hai lựa chọn:

  • Giữ máy chủ nói cho bạn tiến bộ của nó
  • Giữ client (trình duyệt) yêu cầu máy chủ về sự tiến bộ của nó

Giữ máy chủ cho bạn biết tiến trình sẽ dễ thực hiện. Bạn có thể thay vì gọi số Ajax.Updater, tạo thành phần iframe và sửa đổi máy chủ thành, cho mỗi lần lặp lại, kết xuất phản hồi với một số javascript để kích hoạt hiển thị tiến trình trên trình duyệt và để xóa phản hồi đó. Như vậy, trình duyệt sẽ thực thi javascript và tiếp tục đợi cho đến khi phản hồi kết thúc, vì vậy người dùng sẽ thấy chỉ báo tiến trình di chuyển cho đến khi mọi thứ hoàn tất.

Các phương pháp khác có sẵn để máy chủ cho bạn biết về tiến trình của hoạt động. Bạn có thể Bing/Google về Máy chủ Comet.

Để yêu cầu trình duyệt định kỳ hỏi về tiến trình của hoạt động, bạn có thể trả lại mã thông báo cho trình duyệt cho mỗi lần lặp lại mà trình duyệt sẽ kiểm tra xem đó có phải là kết quả cuối cùng hay không. máy chủ để máy chủ tiếp tục nhấn twitter cho tập kết quả tiếp theo hoặc bằng cách nào đó giữ trạng thái (nếu bạn có hỗ trợ trạng thái phiên, có thể thực hiện) trong máy chủ được cập nhật trong mỗi lần lặp và có thể được thăm dò theo yêu cầu riêng.

Tôi hy vọng các đề xuất trợ giúp.

+0

Đây là một ứng dụng điển hình cho các yêu cầu HTTP tồn tại lâu dài hoặc đẩy máy chủ. Xem http://en.wikipedia.org/wiki/Comet_%28programming%29 để biết thêm chi tiết. – John

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