我正在撰写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;
}
};
答案 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
的调用。