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.
Sau đó, tôi cũng cau mày và học cách mã hóa tốt hơn :) – traviss0