2011-08-25 12 views
0

この再帰的なスクリプトを作成しました。このスクリプトは、あなたのどのアドレスにあるかをチェックし、そのフォルダが存在する場合に別のファイル階層をチェックします。たとえば、somerandomsite.com/example/folder/folder1/folder1_1にいるとしたら、somerandomsite.com/ 別の/example/folder/folder1/folder1_1にそのフォルダが存在する場合はリダイレクトすることができます。私はsomerandomsite.com/anotherにリダイレクトするだけです(もちろん、私はsom/folder1 /が存在するがfolder/folder1/folder1_1ではなくsomerandomsite.com/にリダイレクトします)別の/example/folder /私の問題は、実際のスローな再帰的な実装があり、フォルダ "example"に50個のフォルダがあり、フォルダ内に100個のフォルダがあり、folder1にもう1個のフォルダがあり、最後に最後の100個のフォルダがあると言う。レベルの場合、すべての名前に「一致」するまでに時間がかかります。webbrowserに「スタック」しているスクリプトを続行するように指示する方法はありますか?

ブラウザによっては、実行に時間がかかるため、「一部のスクリプトが機能しなくなりました」というエラーメッセージが表示されるものがあります。だから私の質問は、ブラウザにスクリプトを終了させるように指示する方法があるかどうかです。

the script hereのコードがあります。

ディレクトリ検索をどのように実行するのかは、フォルダにxmlhttprequestsを作成し、すべてのフォルダを表示するhtmlバージョンを取得し、各フォルダレベルで単純なパターンマッチングを実行することです。例では、私は

一つの "フォルダ" ためpatternmatchをsomerandomsite.com/example/するsomerandomsite.com、patternmatch "例" のための

一つに4つのXMLHttpRequests、

いずれかを実行し、上記「FOのためpatternmatchをsomerandomsite.com/example/folder/folder1/する"folder1の"

一つのためpatternmatchをsomerandomsite.com/example/folder/しますlder1_1 "

+1

私はあなたの問題に対する解決策はありませんが、あなたは何か難しいことをやっていると思います。残念ながら私はあなたの問題を完全には理解していないので、私は特に推奨することはできません。私の腸は、これはサーバー側で処理するか、ディレクトリ構造のXML/JSON/Textマップを構築し、それを解析する必要があると言います。 –

+0

アルゴリズムをいくつかのステップに分割することができませんでしたか、それらをsettimeoutと一緒にチェーン化できませんでしたか?この方法で、ブラウザは今すぐ呼吸するチャンスを得ます。 – reto

答えて

3

いいえ、この機能は、あなたが許可しているように、遅いスクリプトに対して明示的に設計されています。続行するかどうかは、ユーザーが決定します。エスケープハッチがあれば、あらゆる種類の有害なスクリプトがそれを使用します。

0

いいえWeb Workersを使用して調べてください。しかし、古いブラウザとの互換性には注意が必要です。

1

リクエストが行われている間に実際のスクリプトが実行されていないので、AJAX呼び出しでこの問題が発生するのではないかと疑いがあります。あなたのコードに無限ループがないと肯定的ですか?

ああ、あなたのコードに問題がある:

handleXMLreadystatechangeのためのあなたのイベントハンドラで、それが呼び出すcheckState which spawns a timeout to call itself every second. So every time the state changes you spawn another repeating checkState.

あなたはhandleXMLはすでにそれを呼び出すので、自分自身を呼び出すためにcheckStateを必要としない

ととにかく状態が変わるたびに呼び出されます。また、返されるステータスが200でない場合、checkStateはそれ自身を永遠に呼び出します。、

var checkState = function(xmlhttp, callback) { 
    if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { 
     callback(); 
}; 
+0

これを編集しました。フィードバックをお寄せいただきありがとうございます。しかし、それはまだ遅い、スクリプトを改善する方法に関する他のアイデア? =) – Alex

1

グッド藩主サーバー上でそれを行う:私はあなたにあなたにcheckStateの機能を変更した場合、ブラウザはあなたとずっと幸せになると思います。あなたはすでに "ディレクトリ内のディレクトリのhttprequestリストを取得しています" - サーバー上ですべてを実行します。

0

多くのことがすぐに起こっているので、スクリプトはそれを行っています。

新しいxmlhttprequestが前回終了するまで待機します。

その他の場合は、より高速なブラウザを使用すると、スクリプトを強制的に実行し続けることはできません。

+0

再帰的スクリプトを使ってこれをどうすれば実現できますか?私は "滝"モデルを試しましたが、それは再帰的ではなく、別の関数を呼び出すものですか?ありがとう=) – Alex

関連する問題