我有一个类ChatRoom,该类只能在接收到长时间运行的HTTP请求后才能呈现(可能需要1秒或30秒).因此,我需要延迟渲染,直到ChatRoom.json不为空.
I have a class, ChatRoom, that can only render after it receives a long-running HTTP request (it could take 1 second or 30 seconds). So I need to delay rendering until ChatRoom.json is not null.
在下面的代码中,我正在使用Closure Library的 goog.async.ConditionalDelay .它可以工作,但是有更好的方法(也许不需要闭包库)来做到这一点吗?
In the code below, I'm using Closure Library's goog.async.ConditionalDelay. It works, but is there a better way (maybe without needing Closure Library) to do this?
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); } }请注意,"while(json == null){}"是不可能的,因为这将是同步的(阻止所有其他JS执行).
Note that "while (json == null) { }" isn't possible because that would be synchronous (blocking all other JS execution).
推荐答案请考虑以下问题:
(function wait() { if ( chatroom.json ) { chatroom.render(); } else { setTimeout( wait, 500 ); } })();这将每半秒检查一次.
实时演示: jsfiddle/kBgTx/
更多推荐
异步延迟JS直到满足条件
发布评论