2011-06-29 38 views
5

Câu hỏi này chắc chắn có thể được áp dụng cho jQuery nhưng trong trường hợp này tôi đang đề cập đến Nguyên mẫu. Trong doc Prototype nó nói,Những hạn chế của việc sử dụng cuộc gọi ajax đồng bộ là gì?

Kể từ khi sử dụng đồng bộ là khá đáng lo ngại, và thường xấu hương vị, bạn nên tránh thay đổi này. Nghiêm túc.

Tôi không chắc chắn những hạn chế của việc sử dụng cuộc gọi ajax đồng bộ. Dường như có nhiều trường hợp bạn phải chờ cuộc gọi quay lại (không sử dụng các chức năng gọi lại cụ thể). Ví dụ: tôi hiện đang sử dụng số onSuccess, onFailure and onComplete của Prototype để xử lý phần còn lại của mã.

Tuy nhiên, các dịch vụ web tôi sử dụng (tất cả trong nhà) trải rộng hầu hết các dự án và tôi đã được giao nhiệm vụ tạo thêm mã tái sử dụng. Một ví dụ sẽ là một lớp khách hàng trả về các thuộc tính của khách hàng. Một ví dụ đơn giản (lưu ý rằng tôi chỉ hiển thị các chức năng cơ bản để giữ cho nó đơn giản):

Customer = Class.create({ 

    initialize: function(customerId) { 

     new Ajax.Request('some-url', { 
      method: 'get', 
      parameters: { 
       customerId: customerId 
      }, 
      onSuccess: this.setCustomerInfo.bind(this) 
     } 

    }, 

    setCustomerInfo: function(response) { 

     //for the sake of this example I will leave out the JSON validation 

     this.customerInfo = response.responseText.evalJSON(); 

    } 

}); 

Vì vậy, bằng cách sử dụng lớp đơn giản đó, tôi có thể làm như sau trong bất kỳ dự án nào để nhận thông tin khách hàng.

var customer = new Customer(1); 

//now I have the customer info 
document.write(customer.customerInfo.firstName); 

Sử dụng mã trên sẽ không in ra tên của khách hàng. Điều này là do cuộc gọi ajax không đồng bộ. Nó sẽ thực thi document.write cho dù dịch vụ web có mang lại dữ liệu khách hàng hay không. Nhưng tôi không muốn làm bất cứ điều gì cho đến khi dữ liệu đã trở lại và biến khách hàng được thiết lập. Để khắc phục điều này, tôi đặt cuộc gọi ajax thành đồng bộ để trình duyệt sẽ không tiếp tục cho đến khi new Customer(1); hoàn tất.

Phương pháp này có vẻ hoạt động (đặt không đồng bộ thành sai) nhưng đọc tài liệu Prototype cho tôi tạm dừng. Hạn chế của việc sử dụng phương pháp này là gì? Có cách nào khác để làm điều đó, hiệu quả hơn, v.v.?

Tôi sẽ đánh giá cao mọi phản hồi.

Trả lời

2

Hầu hết mọi người cau mày khi gọi ajax đồng bộ vì nó sẽ đóng băng giao diện người dùng cho đến khi hoàn thành, vì nó sẽ không cho phép mã tiếp tục cho đến khi hoàn thành. Làm cho một nói lắp trong giao diện tôi đoán bạn có thể nói.

+0

Sau đó, tôi cũng cau mày và học cách mã hóa tốt hơn :) – traviss0

6

Vâng, ngoài việc thực tế là nó là rất không Javascript, nó có tác dụng thú vị như Hoàn toàn ngăn chặn các trình duyệt của UI. Đó không phải là một vấn đề nhỏ.

Đã thực hiện một số nghiên cứu, đã tìm thấy những điều thú vị. Căn cứ nguyên mẫu "không đồng bộ" tắt của XMLHttpRequest.open. Theo Wikipedia, đây không phải là thứ không phải là một phần bắt buộc của đặc điểm kỹ thuật và nó sẽ ngăn chặn "onreadystatechange".

10

Hãy nhắc nhở bạn rằng JavaScript là đơn luồng

Một đồng bộ IO gọi BLOCKS toàn bộ chủ đề

Một sửa chữa đơn giản là sử dụng chương trình phong cách không đồng bộ sử dụng callbacks.

Customer = Class.create({  
    initialize: function(customerId, cb) { 
     new Ajax.Request('some-url', { 
      method: 'get', 
      parameters: { 
       customerId: customerId 
      }, 
      onSuccess: (function() { 
       this.setCustomerInfo.apply(this, arguments); 
       cb.apply(this, arguments); 
      }).bind(this) 
     } 
    }, 
    setCustomerInfo: function(response) { 
     //for the sake of this example I will leave out the JSON validation 
     this.customerInfo = response.responseText.evalJSON(); 
    } 
}); 

var c = new Customer(1, function() { 
    document.write(customer.customerInfo.firstName); 
}); 
2

Vâng, tôi không thấy rằng đó là vấn đề chặn giao diện người dùng nếu người dùng đang tạo hình ảnh tải trong khi thực hiện cuộc gọi đồng bộ. Nó có thể giống như gửi biểu mẫu.

+0

Vấn đề là người dùng không thể phân biệt * ở tất cả * cho dù trình duyệt bị treo vì có sự cố hay đây là hành vi bình thường. Thông thường, khi một ứng dụng không đáp ứng với đầu vào nữa, tôi giả sử nó bằng cách nào đó bị rơi. –

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