2011-05-30 5 views
4

RubyのArray#compactに相当するJavaScriptは何ですか?JavaScriptでの配列の圧縮

ロングバージョン....私はblog.nemikor.comの例を続けました。彼の最後の例では古いリクエストがクローズされていますが、その後はpendingsが古くなったリクエストで満たされ続けています。これは私にメモリリークのように見えます。

私のソリューションは、以下のようfilterpendingsを反復することですが、pendings.pushpendings = pendings.filter間の競合状態があるかもしれないように、これはそうです。私は妄想していますか?競合状態が存在する場合、どのように修正する必要がありますか?

var pendings = []; 

// there is a route 
app.get('/some/path', function (request, response) { 
    pendings.push({ 
    response: response, 
    requestedAt: new Date().getTime() 
    }); 
}); 

setInterval(function() { 
    var expiration = new Date().getTime() - (1000 * 30); 
    pendings = pendings.filter(function (pending, index) { 
    if (pending.requestedAt > expiration) { 
     return true; 
    } else { 
     pending.response.writeHead(408, { 'Content-Type': 'text/plain' }); 
     pending.response.end(''); 
    } 
    }); 
}, 1000); 
+1

[コンパクトな動作](http://stackoverflow.com/questions/281264/remove-empty-elements-from-an-array-in-javascript) – Zabba

+0

[フィルタ](https://)のMDC doco必要な場合はdeveloper.mozilla.org/ja/JavaScript/Reference/Global_Objects/Array/filter)を参照してください。 – RobG

+0

タイトルの質問への回答をZabbaのリンクに従ってください... – AShelly

答えて

3

JavaScriptにスレッドがないため、競合状態は発生しません。すべてのコードがシーケンスされ、実行が終了した後にのみ制御が転送されます。したがって、他の機能がpendingsに触れる前に、インターバル機能は完了するまで実行されます。

これは、setTimeoutsetIntervalのようなものに当てはまります。

実験として:setTimeoutを使用してタイムアウトを行った場合、1秒後に起動します。その後、2秒間ブロックするwhileループを書くと、の後にタイムアウトがになります。これは1秒よりもずっと長くなります。あなたがこれは、コレクション、配列やオブジェクトに対処するために多くの有用な低レベルの機能を提供しUnderscore.js図書館で
http://documentcloud.github.com/underscore/

を見てみたいことがあり

var timer = setTimeout(function() { 
    alert("hi!"); 
}, 1000); 
var now = new Date(); 
var till = new Date(now + 2); 
while(new Date() < till) {} // block for 2 seconds 
2

何か。それはcompact機能(あなたが探しているものとは異なる目的を果たしていると思うが)とfilterの両方の機能を含んでいる。

+0

アンダースコア.jsを提案してくれてありがとう。私はそれを見てきましたが、私はまだそれが必要でないので、それについて考えることはありませんでした。 Node.jsはフィルタメソッドを提供しており、@ frits-van-campenの答えによれば、競合状態を心配する必要はありません。 :) – ravinggenius

1

I/Oを実行していない、つまりメモリ内操作しか行っていない限り、イベントループの性質上、中断されないことが保証されます。

コレクションが長すぎる場合(数千以上など)、イベントループをしばらくブロックして他のリクエストを処理しないようにすることができますので注意してください。

関連する問題