JavaScript:已初始化保证对象

时间:2011-08-11 09:01:37

标签: javascript jquery internet-explorer cross-browser internet-explorer-6

我运行的代码初始化了一个抽象的图形包。创建图形实例后,我从服务器获取带有get请求的数据,并希望更新图形数据提供程序。问题是,有时(对于IE6-8),持有数据提供者的对象尚未初始化,因此当我尝试更新数据时,javascript崩溃。

在对象准备好之前,如何延迟代码? 伪:

...
...
...
// Init code
$graph = new Graph();
...
...
...
// GET request
$.getJSON(..., ..., function(data) {
  ...
  ...
  ...
  // Make sure that $graph.series[0] is ready
  // Should not use while, but something similar in functionality
  while (!($graph.series && $graph.series[0]))
    ; // Sleep the code until object is ready

  // Set the dataprovider after init complete
  $graph.series[0].setData(data);
  ...
  ...
  ...
});
...
...
...

此致

2 个答案:

答案 0 :(得分:0)

使用while,而不是您的setTimeout循环(如您所确定的那样,不是您想要的)。

$.getJSON(..., ..., function(data) {
    processData();
    function processData() {
        if (!($graph.series && $graph.series[0])) {
            // Not ready yet, schedule to try again in a moment
            // and quit
            setTimeout(processData, 0);
            return;
        }

        // It's there, process
        $graph.series[0].setData(data);
    }
});

延迟将超过0毫秒,当然(通常不小于5-10),但它为其他代码提供了为您初始化该对象的机会。您可能希望添加超时,以便在出现问题时不要永远循环。

即使在我们从data回调之后我们仍然可以访问getJSON,这似乎很奇怪,但我们可以因为processData是一个闭包回调的上下文,因此它对该上下文中的所有内容都有持久的引用(包括data)。更多:Closures are not complicated

答案 1 :(得分:0)

我几天前做过类似的事情。在此代码中,我将验证对象 gAuto 是否已使用required属性进行初始化。希望它有所帮助。

function check(callback) {
    if (gAuto.hasOwnProperty('gm_accessors_')) {
        callback();
    } else {
        console.log('waiting for init');
        init(callback);
    }
}

function init(callback) {
    console.log('initializing');
    setTimeout(function() {
        check(callback);
    }, 1);
}

init(function() {
    console.log('init done!');
            // access 'gm_accessors_' here
});