0

次のような配列にストリームを書き込む node.js スクリプトがあります。

var tempCrossSection = [];

stream.on('data', function(data) {
    tempCrossSection.push(data);
});

配列を空にし、次のようにデータに対して何らかの処理を行う別のコールバック:

var crossSection = [];

setInterval(function() {
    crossSection = tempCrossSection;
    tempCrossSection = [];

    someOtherFunction(crossSection, function(data) {
        console.log(data);
    }
}, 30000);

ほとんどの場合、これは機能しますが、setInterval コールバックが 30000 ミリ秒間隔で 2 回以上実行されることがあります (これは、イベント ループに置かれているキューに入れられた呼び出しではありません)。これを cronJob として実行しても、同じ結果が得られました。setInterval が 30000 ミリ秒ごとに 1 回だけ実行されるようにする方法があるかどうか疑問に思っています。おそらく、全体としてより良い解決策があります。ありがとう。

4

2 に答える 2

0

何か非同期がある場合は、代わりに setTimeout を使用する必要があります。そうしないと、非同期関数に時間がかかりすぎると問題が発生します。

var crossSection = [];

setTimeout(function someFunction () {
    crossSection = tempCrossSection;
    tempCrossSection = [];

    someOtherFunction(crossSection, function(data) {
        console.log(data);
        setTimeout(someFunction, 30000);
    }
}, 30000);
于 2013-03-29T20:33:57.750 に答える
0

JavaScript のタイマーは、多くの人が考えるほど信頼性が高くありません。あなたはすでにそれを見つけたようですね!重要なのは、タイマーのコールバックの最後の呼び出しからの経過時間を測定して、このサイクルで実行するかどうかを決定することです。

http://www.sitepoint.com/creating-accurate-timers-in-javascript/を参照してください。

最終的な目標は、たとえば毎秒 (タイムアウト値よりも高い精度で) 起動するタイマーを作成し、関数を起動するかどうかを決定することでした。

于 2013-03-29T20:36:30.427 に答える