我创建了一个类,在初始化时,开始下载JSON文件。
但是,下载以异步方式运行。 因此,在我声明之后,我开始使用它,但它失败了,因为它还没有加载文件。
我可以关闭异步,但还有另一种方法可以不冻结浏览器吗?
我目前正在使用setTimeout选项解决它,但这似乎是一个丑陋的黑客。
var d;
$(document).ready(function() {
d = new Duk('element');
d.getBlueprint('hud.json');
setTimeout(start, '2000');
});
function start(){
test = new d.Dialog(d.blueprint.screens.test);
test.draw();
}
答案 0 :(得分:1)
您必须将事件处理程序附加到对象加载完成事件。您正在使用的图书馆必须提供此活动。我不知道Duk
是什么,或者getBlueprint()
做了什么,但你应该检查文档中是否有类和方法,并查看是否存在不完整的回调。如果有,你会做这样的事情:
$(document).ready(function() {
d = new Duk('element');
d.getBlueprint('hud.json', {
onComplete: function() {
test = new d.Dialog(d.blueprint.screens.test);
test.draw();
}
});
});
显然,我刚刚做到了。我不知道你的库是否有像这样定义的onComplete方法,但我希望你明白我的意思。如果不了解您正在使用的库,我无法提供更好的示例。
答案 1 :(得分:0)
超时不是解决此问题的方法。
您希望在请求旁边设置回调函数,以便处理请求的对象知道响应进入时要执行的操作。
从你的代码中不清楚你正在使用什么框架(我无法理解getBlueprint
,这似乎是初始化远程请求的调用),所以如果你能提供更多信息在此,我们可以提供更多定制化的帮助。
答案 2 :(得分:0)
您希望getBlueprint()方法能够接受在文件下载完成后运行的回调。
function getBlueprint(file, callback)
{
// do whatever to get the file
// ...
// trigger the callback
callback();
}
$(document).ready(function() {
var d;
function start(){
test = new d.Dialog(d.blueprint.screens.test);
test.draw();
}
d = new Duk('element');
d.getBlueprint('hud.json', start);
setTimeout(start, '2000');
});
答案 3 :(得分:0)
我同意回调函数是正确的方法。如果这是您无法修改的代码,您可以执行此类操作,但严重的是,使用回调!
function wait_for_load(expr, func)
{
var interval = window.setInterval(function()
{
if(eval(expr))
{
window.clearInterval(interval);
func();
}
}, 20);
}
var d;
$(document).ready(function() {
d = new Duk('element');
d.getBlueprint('hud.json');
wait_for_load('d.blueprint', start);
});