24

Firefox15とChrome21で、次のコードで問題が発生しています。

setInterval(function () { console.log('test') }, 300000000000)

どちらのブラウザでも、関数はすぐに実行され、非常にすばやく繰り返されます。確かに、それは大きな数(今から約10年後を表す)ですが、小さな数や負の数として扱われるとは思いません。ドキュメントで最大許容遅延は見られませんでした。標準の最大値があるのか​​、それともブラウザが面白いだけなのか、誰か知っていますか?

4

6 に答える 6

27

間隔は署名された32ビット整数(テストされた実装ではGoogle ChromeのV8)に格納されるため、表示される動作は、間隔が負の数にオーバーフローした結果です(この場合、間隔は0)でした。したがって、使用できる最大間隔はです2**31 - 1

これが事実であると私が判断した方法は次のとおりです。

setInterval(function(){console.log("hi");}, Math.pow(2,31));

間隔が。のように動作します0

setInterval(function(){console.log("hi");}, Math.pow(2,31) - 1);

私が待っていた時間に発砲しません。

setInterval(function(){console.log("hi");}, Math.pow(2,33) + 1000);

間隔が1000(1秒)のように動作します。ここでは、2**33は最初の32ビットには影響しないため、。を取得し1000ます。

可能な限り最高の間隔2**31-1msは、25日の少し恥ずかしがり屋なので、合理的なものには十分すぎるほどです。

于 2012-09-28T04:25:03.720 に答える
11

現在、ドキュメントは見つかりませんが、タイマー値が32ビットの符号付き整数に収まらなければならない場合でも驚かないでしょう。

于 2012-09-28T04:14:39.770 に答える
4

最大遅延は231-1 、つまり2,147,483,647msだと思います。符号付き32ビット整数の最大値(ミリ秒)。署名されていない場合は、2 32 -1=4,294,967,295になります。

于 2012-09-28T04:14:29.957 に答える
2

これよりも大きな間隔が必要な場合は、最大日数2,147,483,647の間隔を設定できるTypeScriptの例を次に示します。458,496,310,632,933,156,516.92

明らかに、私はこれがその長い間機能することをテストしていません:D。

export const setLongInterval = (callback: any, timeout: number, ...args: any): Timeout => {
    let count = 0;
    const MAX_32_BIT_SIGNED = 2147483647;
    const maxIterations = timeout / MAX_32_BIT_SIGNED;

    const onInterval = () => {
        ++count;
        if (count > maxIterations) {
            count = 0;
            callback(args);
        }
    };

    return setInterval(onInterval, Math.min(timeout, MAX_32_BIT_SIGNED));
};

export const setLongTimeout = (callback: any, timeout: number, ...args: any): Timeout => {
    let count = 0;
    let handle: Timeout;
    const MAX_32_BIT_SIGNED = 2147483647;
    const maxIterations = timeout / MAX_32_BIT_SIGNED;

    const onInterval = () => {
        ++count;
        if (count > maxIterations) {
            count = 0;
            clearInterval(handle);
            callback(args);
        }
    };

    handle = setInterval(onInterval, Math.min(timeout, MAX_32_BIT_SIGNED));
    return handle;
};
于 2021-05-01T22:34:00.617 に答える
1

最大は2,147,483,647(2 31 -1)

数値をそれより大きくすると、すぐに実行されることに注意してください(負の値を入力すると、ブラウザーは無限にループします)

setInterval(()=>console.log('n'),2147483647)
31
setInterval(()=>console.log('y'),2147483648)
38
(1588) y
于 2017-08-29T01:04:55.767 に答える
1

delay引数は、符号付き32ビット整数に変換されます。これにより、IDLで符号付き整数として指定されるため、遅延が事実上2147483647ミリ秒に制限されます。

ドキュメントに記載されています

于 2022-01-25T13:42:47.880 に答える