1

我想在 javascript 代码中设置延迟,以便在运行 javascript 之前生成 XML 文件。这是我的html代码

<body onLoad="Func1Delay()">
<div id="map"></div>
</body>

在这个 Func1Delay() 函数中,我编写了代码来延迟 javascript 的执行

function Func1Delay()
    {
    setTimeout("load()", 3000);
    }

load() 是javascript函数吗?如何延迟 javascript 代码的执行,以便在代码执行之前成功生成 xml 文件?

4

3 回答 3

1

您希望函数尽快执行,但在每种情况下都在成功生成 xml之后。

在这种情况下,您应该避免使用固定的时间量(因为您不确切知道该值),但请尝试以下操作:

function load(){

    if (/*check here if the xml has *not yet* been generated*/){
          setTimeout(load,50); // try again in 50 milliseconds
          return;
    }

    // do your stuff here
}

只要您的 xml 尚未准备好,它就会循环,并在它可用时立即启动。

关于setTimeout的一般:

您可以传递一个字符串,但出于多种原因,强烈建议不要这样做。而是传递函数引用或这样的函数:

// function reference
setTimeout(load,3000) // no `()` !

// function
setTimeout( function(){load()},3000)

如果您需要将参数传递给函数,则不能使用第一个选项,但需要使用第二个选项,您可以轻松地传递它们load(params)

如果你传递这样的函数:setTimeout(load(),3000)它会执行函数load并将其返回值传递给超时。但是,您希望在 3 秒后调用该函数,因此只传递对该函数的引用。

但是请注意,如果您以这种方式执行函数,您将拥有不同的范围。

于 2012-12-10T09:25:00.373 回答
1

你就是这样做的,除了你不想使用字符串(尽管它有效——前提是你有一个load在全局范围内定义的函数)。setTimeout安排一个函数在给定的毫秒数之后被调用。

最好给它一个实际的函数参考:

function Func1Delay() {
    setTimeout(load, 3000);

    function load() {
        // Stuff to do three seconds later
    }
}

请注意,您用来触发它的事件onloadofbody已经在页面加载周期的非常非常晚的时候发生了,因此您等待的任何事情都可能已经完成;相反,如果它可能需要超过三秒钟,您可能等待的时间不够长。因此,如果您可以检查某些内容是否已完成,您可以进行轮询,如下所示:

function Func1Delay() {

    check();

    function check() {
        if (theWorkIsDone) {
            // Do something with the work
        }
        else {
            // Check back in 100ms (1/10th of a second)
            setTimeout(check, 100);
        }
    }
}
于 2012-12-10T09:25:47.567 回答
1

似乎您的 downloadUrl 函数提供了回调。在加载 XML 之后,回调函数会自动触发。您不需要 3 秒的延迟,只需将您的逻辑移动到回调函数中即可。像这样的东西:

function Func1Delay() {
    downloadUrl("location.xml", function (data) {
        var xml = data.responseXML;
        // do any thing with xml, it is loaded!
        // alert(xml);
    });
}
于 2012-12-10T10:48:35.770 回答