如何使用Javascript删除地图中的这种元素?


function Stream() {
let subscriber = new Map();
return {
subscribe: function(method) {
if(typeof method === 'function') {
subscriber.set(method);
}
else
throw new Error('Pass a valid method.');
},
push: function(val) {
[...subscriber].forEach(([method]) => method(val));
},
unsubscribe: function(method) {
console.log(subscriber.has([method]));
console.log([method]);
[...subscriber].forEach(([method]) => console.log([method]));
if (typeof method === 'function' && subscriber){
subscriber.delete([method]);
}
[...subscriber].forEach(([method]) => console.log([method]));
}
};
}
var stream = new Stream();
stream.subscribe((val)=>console.log(val*1));
stream.subscribe((val)=>console.log(val*2));
stream.subscribe((val)=>console.log(val*3));
stream.push(2);
stream.push(3);
stream.unsubscribe((val)=>console.log(val*3));
stream.push(4);

在unsubscibe函数中,显示"subscriber.has([method]("向我返回false,但是在我打印出该方法并与订阅者映射的一侧进行比较之后,它看起来是一样的。这里有什么问题吗?

你有两个主要问题。

首先,对.has()的论证应该只是method,而不是[method]。键subscribers只是函数,而不是数组。您编写[method]的所有位置都不应在数组中。

其次,需要使用命名函数。具有相同源代码的两个函数实际上并不相等,因此.has()无法匹配它们。

你应该使用Set而不是Map,因为你没有将任何值与函数相关联。而且没有必要使用[...subscriber]MapSet都有forEach遍历元素的方法。

console.log(((val)=>console.log(val*3)) == ((val)=>console.log(val*3)))

将记录false

function Stream() {
let subscriber = new Set();
return {
subscribe: function(method) {
if(typeof method === 'function') {
subscriber.add(method);
}
else
throw new Error('Pass a valid method.');
},
push: function(val) {
subscriber.forEach((method) => method(val));
},
unsubscribe: function(method) {
console.log(subscriber.has(method));
console.log(method);
subscriber.forEach((method) => console.log(method));
if (typeof method === 'function' && subscriber){
subscriber.delete(method);
}
subscriber.forEach((method) => console.log(method));
}
};
}
var stream = new Stream();
const times1 = (val)=>console.log(val*1);
stream.subscribe(times1);
const times2 = (val)=>console.log(val*2);
stream.subscribe(times2);
const times3 = (val)=>console.log(val*3)
stream.subscribe(times3);
stream.push(2);
stream.push(3);
stream.unsubscribe(times3);
stream.push(4);

最新更新