2012-10-05 30 views
20

Tôi có một ứng dụng xương sống có một số lượt xem. Chuyển đổi giữa các chế độ xem sẽ kích hoạt các yêu cầu Ajax để nhận các bộ sưu tập khác nhau. Tôi muốn dừng yêu cầu ajax "đọc" hiện tại nếu yêu cầu mới được bắt đầu. Có thể không?Có thể dừng các yêu cầu "đọc" của Backbone

Trả lời

36

Ok vì vậy đây là những gì tôi đã làm

Tôi lưu các yêu cầu tìm nạp trong một biến

app.fetchXhr = this.model.fetch(); 

Trong router của tôi, tôi có một chức năng mà sẽ chăm sóc đóng các quan điểm và render lần xem . Nó cũng đảm bảo kích hoạt bất kỳ trình kích hoạt nào cần thiết cho mỗi thay đổi chế độ xem nhưng điều đó không có liên quan trong câu hỏi này.

Trước khi làm bất cứ điều gì, chức năng router này thực hiện như sau

//Stop pending fetch 
if(app.fetchXhr.readyState > 0 && app.fetchXhr.readyState < 4){ 
    app.fetchXhr.abort(); 
} 

Tôi hy vọng điều này sẽ giúp

+0

Tôi có vấn đề liên quan nhưng tôi có nhiều bộ sưu tập. Vì vậy, trước khi tôi hủy bỏ một yêu cầu, tôi cần phải chắc chắn rằng nó được liên kết với một bộ sưu tập cụ thể. Tôi hỏi câu hỏi đó ở đây, có lẽ bạn cũng đã giải quyết vấn đề này? http://stackoverflow.com/questions/21919690/association-between-backbone-collection-and-xhr-object-created-when-fetching – wuliwong

+0

Đã không thực hiện điều này nhưng một điều bạn có thể thử là lưu trữ tất cả xhr yêu cầu trong một mảng. Trên mỗi yêu cầu xhr hoặc trên mỗi thay đổi xem, bạn có thể lặp qua mảng để xóa những người hoàn thành và dừng những người mà bạn muốn dừng lại. Điều đó sẽ cung cấp một dọn dẹp đầy đủ. – Xerri

4

Tôi cho rằng bạn đang sử dụng xương sống với jQuery. Nếu vậy, những câu dưới đây dường như cung cấp một câu trả lời cho bạn:

Abort Ajax requests using jQuery

Backbone fetch trả về xhr họ đang nói về, IIRC.

+0

nhưng sẽ không tìm nạp lại sau khi hoàn tất? Bạn không chắc chắn cách sử dụng liên kết mà bạn cung cấp để triển khai nó trong Backbone – Xerri

+0

Backbone sử dụng các cuộc gọi ajax bình thường (thông qua Zepto hoặc jQuery), có nghĩa là cuộc gọi đến máy chủ không đồng bộ và vẫn có khả năng bị chấm dứt. – JayC

-3

Có lẽ bài trả lời cuối :)

Sử dụng thời gian chờ để xác định một giá trị thời gian chờ. Điều này sẽ kích hoạt chức năng lỗi. Ở đây truy vấn có thể bị hủy bỏ.

Có lý do nào khiến bạn muốn hủy truy vấn không?

+0

Tôi muốn hủy bỏ vì nếu tôi thay đổi chế độ xem trước khi truy vấn hoàn tất, một lỗi sẽ được tạo khi quá trình tìm nạp hoàn tất và chế độ xem sẽ bị xóa. – Xerri

9

Một câu trả lời muộn khác trong trường hợp người khác gặp phải vấn đề này.

Tôi đã kết thúc ghi đè Backbone.sync để thêm nhóm đối tượng XHR và tùy chọn hủy bỏ yêu cầu đang chờ xử lý khi tìm nạp.

var sync = Backbone.sync 
    , xhrPool = []; 

Backbone.sync = function(method, model, options) { 
    options = options || {}; 
    if (method === 'read') { 
    if (options.abortPending == true) {  
     for (var i = 0; i < xhrPool.length; i++) { 
     if (xhrPool[i]['readyState'] > 0 && xhrPool[i]['readyState'] < 4) { 
      xhrPool[i].abort(); 
      xhrPool.splice(i, 1); 
     } 
     } 
    } 

    // cleanup xhrPool 
    // todo: make removal from the pool an 'always' jqXHR callback 
    // instead of cleanup on every read? 
    for (var i = 0; i < xhrPool.length; i++) { 
     if (xhrPool[i]['readyState'] === 4) { 
     xhrPool.splice(i, 1); 
     } 
    } 

    var xhr = sync(method, model, options); 
    xhrPool.push(xhr); 
    return xhr; 
    } else { 
    return sync(method, model, options); 
    } 
}; 
+0

Rất hay ... có thể không linh hoạt nếu bạn thực hiện nhiều yêu cầu tìm nạp trong một chế độ xem cụ thể. FYI ... Một trong những lý do tôi cần điều này là để tránh bị lỗi khi quá trình tìm nạp hoàn tất nhưng chế độ xem đã thay đổi (vì vậy phần tử DOM có thể chứa dữ liệu không còn ở đó nữa). Một thử/nắm bắt đơn giản xung quanh tìm nạp đã sửa lỗi này. – Xerri

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