什么是JavaScript相当于Ruby的Array#compact?
长版....我跟着blog.nemikor.com的例子。他的最后一个例子关闭了旧的请求,但随后pendings
继续充满了过时的请求。这看起来像是一个记忆泄漏给我。
我的解决方案是使用pendings
对filter
进行迭代,如下所示,但似乎pendings.push
和pendings = 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);
答案 0 :(得分:3)
JavaScript中没有线程,因此没有竞争条件。所有代码都按顺序排列,只有在完成运行后才会进行控制。因此,在任何其他函数触及pendings
之前,您的间隔函数将一直运行到完成。
适用于setTimeout
和setInterval
等内容。
作为实验:如果您使用setTimeout
在1秒后触发超时。之后你写了一个阻塞2秒的while循环,你的超时会在之后触发,超过1秒。
原始的东西:
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
答案 1 :(得分:2)
您可能需要查看Underscore.js库 http://documentcloud.github.com/underscore/
这提供了许多有用的低级函数来处理集合,数组和对象。它包括compact
函数(虽然我认为它与您正在查找的内容有不同的用途)和filter
函数。
答案 2 :(得分:1)
只要您没有进行I / O操作,即您只进行内存操作,就可以保证不会中断(由于事件循环的性质)。
这样,小心,如果你的集合太长(就像上千个或更多),因为你可以阻止事件循环一段时间,而不是让其他请求得到服务。
答案 3 :(得分:0)
一个旧的线程,但它应该得到原始问题的答案:
什么是与Ruby的Array#compact等效的JavaScript?
list1 = [null, 'no', 'nulls', null]
// With plain JS
jsFilter = list1.filter(function (obj) { return obj })
// With ES6
let filtered = list1.filter((obj) => obj)
//> (2) ["no", "nulls"]
console.log(es6Filter)
但是有一个警告,因为:
filter()为数组中的每个元素调用提供的回调函数一次,并构造所有值的新数组 为此,回调返回强制为true的值。
falsey = [false, 0, 0n, '', NaN, null, undefined]
truthy = [true, 1, ' ']
list2 = ['returns', 'only', 'truthy', 'values'].concat(truthy).concat(falsey)
let filtered = list2.filter((obj) => obj)
//> (7) ["returns", "only", "truthy", "values", true, 1, " "]
console.log(filtered)
要使其像Ruby的紧凑版一样正常工作,您可以执行以下操作:
falsey = [false, 0, 0n, '', NaN, null, undefined]
truthy = [true, 1, ' ']
list3 = ['works', 'like', "Ruby's", 'compact'].concat(truthy).concat(falsey)
let them_go = [null, undefined] // Just a fun with variable names
let filtered = list3.filter((obj) => { return !them_go.includes(obj) })
//> (12) ["works", "like", "Ruby's", "compact", true, 1, " ", false, 0, 0n, "", NaN]
console.log(filtered)
如果您要从数组中删除所有空元素(空字符串,数组和对象),可以在此处查看我的答案-> https://stackoverflow.com/a/59905255/3251051
参考: