【问题标题】:setTimeout not executing [closed]setTimeout 未执行 [关闭]
【发布时间】:2012-03-19 12:26:08
【问题描述】:

我的 setTimeout 函数不想工作。我没有收到任何警报,所以我假设我做了一些非常愚蠢的事情。

var timeout = 1000;
for(k=0;k<pages.length;k++)
{
    randomnumber=Math.floor(Math.random()*pages[k].length);
    setTimeout(function() {
        $.ajax({
            type: 'GET',
            url: pages[k][randomnumber],
            success: function(data) {
                alert(data);
                if(data.indexOf('VIDEO_LENGTH') > 0)
                {
                    timeouttext = data.substr(data.indexOf('VIDEO_LENGTH')+12);
                    timeouttext = timeouttext.substr(timeouttext.indexOf('.'));
                    timeout = parseInt(timeouttext);
                    alert(timeout);
                }
                else
                    timeout = 1000;
                $('#loader').hide('fast','fade');
                $('#information').html(data);
                $('#information').show('fast','fade');
            }
        })
    },timeout);
    alert("PAGE " + k + " RandomNumber " + randomnumber + " : " + pages[k][randomnumber]);
    if(k==3) {
        k = 0;
    }
}

谁能帮帮我。

【问题讨论】:

  • 当您发布问题并引用“数据”之类的内容时。发布数据的样子总是很有用的......
  • data 是一个简单的 text/html 文件,随 ajax 请求一起加载。

标签: javascript


【解决方案1】:

编辑:好的跟随错误:

调用页面 url 时的 var k 与预期不符。所以试试:

{
    randomnumber=Math.floor(Math.random()*pages[k].length);
    var selectedIndex = k; // store current k
    setTimeout(function() {

    $.ajax({
        type: 'GET',
        url: pages[selectedIndex][randomnumber], // use stored k
 ...

【讨论】:

  • 如果速记不需要括号。
  • 是的...但是如果他关闭它,我想他想打开它:) 但是有奇数个括号
  • 是的,我的错。请编辑你的答案,这样我就可以投票了。
  • 不管怎么数,括号的个数都匹配……
  • @DarkRanger 根据您发布的代码:最后一个} 匹配大for-loop,倒数第二个}没有匹配。 (可能应该与 if(k==3)-construct 匹配。)console.log(status) 在说什么?
【解决方案2】:

当您使用 FireBug 或 CHrome 的开发人员工具调试代码时,您会看到您的 Ajax 请求吗?

在我看来,您从来没有参加过每个请求的“成功”事件。由于您的 Ajax 请求中没有“错误”事件,因此您永远不会看到任何反馈。

【讨论】:

    【解决方案3】:

    您的 setTimeout 是正确的。进一步检查错误:

    1. 在控制台中检查您的请求是否正在发送。

    2. 添加 error: function(){}complete:function(){} 块以记录请求的状态,以查看您的服务器端是否破坏了您的代码。

    编辑:(我建议你不要使用简写if,它很容易出错。

    【讨论】:

    • 我在 LastCoder 的回答之后添加了一个错误块。我没有得到任何回应。 AFAIK,正在发送请求(根据控制台)
    • 更正你的 if-condition 缺少{(检查控制台是否提示任何错误),并在完整或错误块中根据ajax-Docs 添加一个console.log() 以查看,哪个返回状态。
    【解决方案4】:

    试试这个(更新fiddle here

    var funfacts= ['URL1','URL2','URL3'];
    var multimedia= ['URL4','URL5'];
    var employees = ['URL6','URL7','URL8','URL9','URL10'];
    var information = ['URL11','URL12','URL13'];
    
    var pages = [funfacts, multimedia, employees, information];
    var timeout=1000;
    var t=0;
    for(i=0;i<pages.length;i++)
    {
        (function(value){
            for(j=0;j<pages[value].length;j++)
            {
                t++;
                (function(iv, ij){
                    var tmo = timeout*t;
                    setTimeout(function(){
                        callAjax(iv, ij);
                    }, tmo);
    
                })(value, j); 
            }
    
        })(i);             
    }
    
    function callAjax(i, j)
    {
        $.ajax({
            type: 'GET',
            url: pages[i][j],
            success: function(data) {    
                if(data.indexOf('VIDEO_LENGTH') > 0) // indexOf should be checked if(var.indexOf('sometext')!=-1)
                {
                    // your code
                }
                else
                {
                    // your code
                }
            }
        });
    }
    

    ​如果其他一切都很好,那么它应该可以工作。

    您还可以阅读 SO 上的 thisthis

    【讨论】:

    • 感谢您的回答。你的是迄今为止效果最好的。但是我仍然有一个问题,即 ajax 调用之间没有暂停。我的控制台显示:GET http://localhost/info_screens/content/funfacts/0.html GET http://localhost/info_screens/content/multimedia/0.html GET http://localhost/info_screens/content/employees/0.html GET http://localhost/info_screens/content/information/0.html 但是这些之间没有暂停。
    • 只是对if(data.indexOf... 的评论 注意:我知道'VIDEO_LENGTH' 永远不会在位置0。虽然我知道这一点,但它仍然不是一个好的编码习惯,所以我改变了它.感谢您指出。
    • 糟糕我搞错了,“k”应该是“i”,url: pages[k][randomnumber] 应该是 url: pages[i][randomnumber]
    • 我发现了最后一个错误。 :) Async false 什么都不做。仍然同时加载所有页面并显示最后一个...
    • 我注意到的另一件事,它也不会将 k 重置为 0。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-18
    • 2021-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多