javascript setTimeout无法识别函数参数

时间:2011-09-15 14:25:53

标签: javascript google-chrome settimeout

我正在撰写Google Chrome扩展程序。我使用setTimeout来减慢对服务器的请求速度。但是setTimeout没有按预期工作。它返回一个错误,表示未定义reqUrl。

基于对stackoverflow上类似问题的回答,看来这是一个超出范围的问题,我不明白如何解决它,除了使reqUrl成为一个全局变量,这似乎不是一个很好的解决方案。如果我删除括号,它就会失控,完全没有时间延迟。

如何使这项工作?

这是代码。我已经包含了减速功能,虽然我不认为这是问题的核心。

openDetailPg(profileLink[currentLink]); 
function openDetailPg(reqUrl)
{
    console.log('openDetailPg at '+reqUrl);
    setTimeout("createDetailWindow(reqUrl)",slowDown());
    ++sendCount;
    timeOfLastRequest=new Date().getTime();
};
function createDetailWindow(detailUrl)
{
    console.log('createDetailWindow');
    chrome.tabs.create({windowId: mainWindowId, url: detailUrl}, 
    function (tab)
    {
        console.log('    OpenDetailPg Created Tab '+tab.id+' with slow down of '+slowDown().toFixed(0));
        chrome.tabs.executeScript(tab.id, {file: 'profile.js'});
    })
};
function slowDown()
{
    //console.log('  Slowdown: last interval '+ (new Date().getTime()-timeOfLastRequest)+' milisec.')
    if (new Date().getTime()-timeOfLastRequest>minDelay)
    {
        console.log('  Previous Delay Greater Than Minimum Delay, Resetting Speed Count');
        sendCount=1; 
        timeOfFirstRequest=new Date().getTime(); //else forget about it, reset time of first request
    }
    elapsedTime=new Date().getTime()-timeOfFirstRequest;
    avgSpeed = elapsedTime/sendCount;
    //console.log("  Started @ "+timeOfFirstRequest+" Current time "+new Date().getTime()+" Avg time fr 1st HTTPRequest "+avgSpeed.toFixed(0)+' milisec over '+sendCount+' Req');
    if (avgSpeed<minDelay)
    {
        //console.log("  Delaying request by "+((minDelay-avgSpeed).toFixed(0))+" milisecs");
        return minDelay-avgSpeed;
    }
    else
    {
        //console.log('  No Delay on Request');
        return 1;
    }
};

6 个答案:

答案 0 :(得分:4)

setTimeout({functionname},{timeout},{param1},{param2} ...)

例如

setTimeout(callMe, 1000, 'say','hello');
function callMe(p1, p2){
alert(p1+" "+p2); //alerts say hello
}

答案 1 :(得分:3)

function openDetailPg(reqUrl)
{
    console.log('openDetailPg at '+reqUrl);
    setTimeout(function(){createDetailWindow(reqUrl)},slowDown());
    ++sendCount;
    timeOfLastRequest=new Date().getTime();
};

答案 2 :(得分:3)

您需要使用匿名函数,例如:

setTimeout(function(){createDetailWindow(reqUrl)},slowDown());

答案 3 :(得分:2)

试试这样:

setTimeout(function() { createDetailWindow(reqUrl); }, slowDown()); 

答案 4 :(得分:2)

试试这个:

setTimeout(function(){ createDetailWindow(reqUrl) },slowDown());

答案 5 :(得分:0)

您正在执行的JavaScript将如下所示:createDetailWindow(reqUrl),这实际上并不是您想要的 - 您尝试将最初传入的字符串传递给openDetailPg,对吧?因此,您传递给setTimeout的字符串需要正确构建:"createDetailWindow('" + reqUrl + "')"(假设reqUrl将始终正确转义)。

顺便说一句,最好将内容压缩到sscce,我花了一段时间才查找setTimeout的调用。