2011-09-15 6 views
3

Google Chrome拡張機能を作成しています。私はsetTimeoutを使用して、サーバーへの要求の速度を落とします。しかし、setTimeoutは期待どおりに動作していません。 reqUrlが定義されていないというエラーを返します。javascript setTimeoutが関数パラメータを認識しない

これは範囲外の問題であり、reqUrlを非常に良い解決策ではないように見えるグローバル変数にする以外は解決方法を理解できません。私が括弧を削除すると、制御が無くなり、時間の遅延は全くありません。

この作品を作成するには?

ここにコードがあります。私はそれが問題の中心ではないと思うが、私はslowdow関数を含んでいる。

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; 
    } 
}; 
+2

**今後のアドバイス**次回は、あなたが問題を解決するためのコードの最低額を提供しています。あまりにも多くのコードを添付しています。コードの量が圧倒されているため(ロギングコールをコメントアウトしたものを含む)、あなたを助けようとする多くの人々は逃げるかもしれません。 –

答えて

0

あなたが実行しているJavaScriptは、次のようになります。あなたが望むものを実際にされていない、createDetailWindow(reqUrl) - 右、もともとopenDetailPgに渡された文字列を渡そうとしyou're?したがって、setTimeoutに渡す文字列は、"createDetailWindow('" + reqUrl + "')"reqUrlが常に適切にエスケープされると仮定して)適切に構築する必要があります。

ところで、それはsscceまでのものを凝縮するのが最善だ、それはにsetTimeoutへの呼び出しを見つけるだけにしばらくかかりました。

+1

(クロージャを使用したその他の回答は私のものよりもはるかにクリーンです) –

+1

文字列を 'setTimeout'に渡すことはむしろ時代遅れの機能です。 –

+0

私のフォローアップコメント。しかし、実際にOPがエラーを見ている理由を説明しています。 –

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

このようにそれを試してみてください。

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

はこれを試してみてください:

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

あなたは、たとえば、そのために無名関数を使用する必要があります。

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

これは非常にうまく動作します。ありがとう。ここでは無名関数を使用する必要があるのはなぜですか?私はそれが範囲の問題を解決することを理解するが、私は理由を理解していない。 – Jerome

+0

これを行うにはいくつかの方法があります。最初のparamの 'setTimeout'関数は、関数または文字列のハンドラを要求します。文字列が渡された場合、 'eval'関数とまったく同じように動作しますが、クロージャを使用すると、その文字列で渡される変数は未定義です。単純なハンドラ 'setTimeout'を渡すと、そのハンドラが呼び出されます。そして、あなたが無名関数を渡すとき、 'setTimeout'はあなたがハンドラを渡したと考えます。クロージャを使用すると、前に宣言された変数が匿名関数内に表示されます。 (var i = 0; i <5; i ++)...} 'everything: – antyrat

3

のsetTimeoutを( {functionname}、{timeout}、{param1}、{param2} ...)

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

これは機能しました!他の解決策のいくつかはうまくいかなかった。 –