在执行之前,在不同时刻清除几个条件

时间:2016-10-12 23:05:52

标签: javascript jquery conditional-statements

我正在寻找一种共同的模式或方法来完成以下任务:

  

服务器向(浏览器)客户端发送消息。这些消息并非完全到达,而是在不同的时刻。

     

对于每个传入消息,客户端将其与条件列表进行比较。如果消息匹配条件,则满足该条件。

     

一旦满足所有条件,客户执行一些订单,并转移到下一组条件。

     

重复此操作,直到满足所有可用条件。

我对此问题的实际解决方法如下:

一组嵌套数组包含条件集,以及满足每组条件时要执行的等效操作。例如:

var condAct = 
[
  [ // set 0
    [ // conditions
      "condition 1", "condition 2"
    ],
    [ // actions
      action, action2
    ]
  ],
...

变量保留实际条件集的数量。

var condStep = 0;

消息到达时会触发单个功能。它将传入消息与实际步骤中的所有条件进行比较。如果消息与条件匹配,则从数组中删除条件。一旦满足此步骤的所有条件,并从阵列中删除,就会执行操作,然后我们进入下一步:

function condRcv(msg){
  for (var i = 0; i < condAct[condStep][0].length; i++) { // for each condition in the actual set
    if(msg === condAct[condStep][0][i]){ // if it matches the incoming message
      condAct[condStep][0].splice(i, 1); // remove the condition from the array
      if(condAct[condStep][0].length === 0){ // and if the actual conditions array is already empty
        for(var j = 0; j < condAct[condStep][1].length; j++){ // for each action in the actions array
          condAct[condStep][1][j]; // execute it
          condStep++; // up a step 
          return; // get outta here
        }
      }
    }
  }
}

我的方法似乎最初是有效的,但程序和代码都有点复杂。

是否有常用的模式或方法,在js甚至jquery中解决这种情况?

感谢。 如果您认为我可以改进这个问题,请告诉我。

1 个答案:

答案 0 :(得分:1)

您可以使用.queue().promise().then()

var q = $({});

var queueName = "conditions";

var arr = [1,2,4,4,5];

var conditions = [2,3,4,5,7];

var results = [];

var fn = function (prop, next) {
  console.log(prop);
  results.push(prop);
  next();
}

q.queue(queueName, $.map(arr, function(curr, index) {
  return function(next) {
    return curr + 1 === conditions[index] 
           ? fn(curr + 1 + " equals " + conditions[index], next) 
           : /* do other stuff here, pass `next` function, call `next` */ 
             fn("curr plus 1 does not equal " + conditions[index], next)
  }
}));

var promise = q.dequeue(queueName).promise(queueName);

promise
.then(function() {
  console.log("complete", results);
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js">
</script>