1

一見すると(タイトルのせいで)「投稿する前にGoogleで検索してみましたか?」のように見えます。質問がありますが、私が経験している特定の問題に対する答えが見つからないようです。私が初心者ならごめんなさい....まだ学んでいます:)

javascript で一時停止をシミュレートする必要がありますが、setTimeout(function_call, timeout) 関数が機能しません。その理由は...そのsetTimeout関数が呼び出されると、関数呼び出しが非同期になります。

ちょっとした背景:
ランダムな間隔で div に入力されるテキストをシミュレートしようとしています。ユーザーがページを表示しているときに、実際にメッセージを入力しているように見せたいです。タイムアウトはランダムな間隔であり、関数呼び出しは非同期で行われるため、テキストはランダムな順序で出力されます。

ここに私がこれまでに持っているもののスニペットがあります:

typeString: function(s)
{
    for(var i=0;i<s.length;i++)
    {                      
        var c = s.charAt(i);
        var temp = setTimeout("MessageType.typeChar('" + c + "')", this.genRandomTime());
    }
}



よろしくお願いします。

Cジャム



更新: 変数にタイマー遅延を追加することで、非同期呼び出しの timeOut をオフセットすることができました。迅速なご回答ありがとうございます。更新されたコードは次のとおりです。

typeString: function(s)
{
    var delay = 0;

    for(var i=0;i<s.length;i++)
    {                     
        var c = s.charAt(i);
        setTimeout("GoogleTyper.typeChar('"+c+"')", delay += this.genRandomTime());
    }
}
4

3 に答える 3

3

タイムアウトを累積的に設定しようとしましたか? 変数をループの外に置いて、それを 0 に初期化します。ここではタイムアウトと呼びましょう。ループの各反復の開始時にこの変数にランダムな時間を追加し、タイムアウトをそれから外します。このようにして、関数が順番に呼び出されることが保証されます。

于 2009-02-07T06:47:07.180 に答える
2

あなたの問題は、今からすべての時間が遅れているものを使用していることです.次のタイマーは前のタイマーの後に起動する必要があります. 以前のタイマー遅延を新しいタイマーに追加するだけです。

typeString: function(s)
{
    var delay = 0;
    for(var i=0;i<s.length;i++)
    {                      
        var c = s.charAt(i);
        delay = delay + this.genRandomTime();
        var temp = setTimeout("MessageType.typeChar('" + c + "')", delay );
    }
}
于 2009-02-07T06:48:08.083 に答える
1

表示する文字を各タイマー イベントに渡す代わりに、各イベント ハンドラーにキュー (配列、リストなど) から次の文字を取得させて、順序が維持されるようにします。

于 2009-02-07T06:49:47.567 に答える