这些值作为函数的参数出现。
7,7,7,7,8,8,1,'和平',3,3,3-,'爱''爱'等等....
需要一种能够检测变化和重复的逻辑。 过滤掉重复。
EXAPMLE
setInterval(function(){
post(url,data,callback(backfromserver){
//every 5 seconds the function will be called with a parameter
//this parameter will have many duplicates/repetitions
//need to detect when something new happens
//first approach: store/hold parameter for later comparison
var store = backfromserver;
if(backfromserver === store){
//repetition
}
else{
//new parameter to work with.
}
//but this if statement will always be true since i have to set it to the same to hold it.
//how do you do it?
});
},5000);
答案 0 :(得分:1)
将您的商店变量从函数中取出,并在检查它是否为重复后为其指定 backfromserver 值。像这样:
var store = null;
setInterval(function(){
post(url,data,callback(backfromserver){
if(backfromserver === store){
//repetition
}
else{
//new parameter to work with.
}
store = backfromserver;
});
},5000);
请记住,如果null是一个允许的参数,那么你必须在开头指定其他方法或尝试其他方法。
答案 1 :(得分:0)
这是您可以使用的另一个选项。我将setInterval
更改为setTimeout
,因为您有一个内部异步调用(帖子),如果帖子需要超过5秒的时间来回答,您就有混合答案的风险。 setTimeout
解决方案将确保在给定时间只发布一个帖子。
var first = true;
var store;
var fetch = function(){
post(url,data,function(err, res) {
if(first || res !== store){
first = false;
store = res;
// ..
//new parameter to work with.
// ..
}
else{
// repetition
}
setTimeout(fetch, 5000);
}
}
setTimeout(fetch, 0);
答案 2 :(得分:0)
我不是破坏性任务的粉丝,所以我可以使用caolan出色的highland库。它也适用于浏览器。
function createStream(url, data, interval) {
return highland(function (push, next) {
setInterval(function() {
post(url, data, function (backFromServer) {
push(null, backFromServer);
next();
});
}, interval);
});
}
var stream = createStream(url, data, interval)
.uniq()
// alternatively use uniqBy
// Now you can do something with these values or return the stream itself
// make sure to call this to start the stream.
stream.resume();
我还没有对此进行测试,因此post
和highland
之间的互动可能无法完美运行,但这应该会让您有足够的想法开始使用。