传入值的流与许多重复。如何检测变化?

时间:2015-07-25 23:15:44

标签: javascript

这些值作为函数的参数出现。

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);

3 个答案:

答案 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();

我还没有对此进行测试,因此posthighland之间的互动可能无法完美运行,但这应该会让您有足够的想法开始使用。