Tôi có một lớp học, ChatRoom
, mà chỉ có thể làm sau khi nó nhận được một yêu cầu HTTP dài chạy (nó có thể mất 1 giây hoặc 30 giây). Vì vậy, tôi cần phải trì hoãn hiển thị cho đến khi ChatRoom.json
không phải là rỗng.không đồng bộ chậm JS cho đến khi một điều kiện được đáp ứng
Trong đoạn mã dưới đây, tôi đang sử dụng Đóng cửa Thư viện của goog.async.ConditionalDelay
. Nó hoạt động, nhưng là có một cách tốt hơn (có thể không cần thư viện đóng cửa) để làm điều này?
ChatRoom.prototype.json = null; // received after a long-running HTTP request.
ChatRoom.prototype.render = function() {
var thisChatRoom = this;
function onReady() {
console.log("Received JSON", thisChatRoom.json);
// Do rendering...
}
function onFailure() {
alert('Sorry, an error occurred. The chat room couldn\'t open');
}
function isReady() {
if (thisChatRoom.json != null) {
return true;
}
console.log("Waiting for chat room JSON...");
return false;
}
// If there is a JSON request in progress, wait until it completes.
if (isReady()) {
onReady();
} else {
var delay = new goog.async.ConditionalDelay(isReady);
delay.onSuccess = onReady;
delay.onFailure = onFailure;
delay.start(500, 5000);
}
}
Lưu ý rằng "while (json == null) {}" không thể thực hiện được vì nó sẽ đồng bộ (chặn tất cả thực thi JS khác).
Tại sao bạn không sử dụng gọi lại từ yêu cầu HTTP? – SLaks
Tôi không thể sử dụng gọi lại đó vì kết xuất có thể được gọi trước khi trả về JSON hoặc 10 phút sau khi trả về. Về cơ bản, tôi muốn có thể gọi render() tại bất kỳ thời điểm nào tôi muốn. –
Bạn vẫn có thể sử dụng gọi lại. Trong 'render', kiểm tra xem JSON đã được trả về chưa, và nếu nó chưa được trả lại, hãy thêm vào một mảng các cuộc gọi lại. Hoặc chỉ cần sử dụng các đối tượng Trì hoãn mới của jQuery, điều này thực hiện điều này cho bạn. – SLaks