我正在寻找一种共同的模式或方法来完成以下任务:
服务器向(浏览器)客户端发送消息。这些消息并非完全到达,而是在不同的时刻。
对于每个传入消息,客户端将其与条件列表进行比较。如果消息匹配条件,则满足该条件。
一旦满足所有条件,客户执行一些订单,并转移到下一组条件。
重复此操作,直到满足所有可用条件。
我对此问题的实际解决方法如下:
一组嵌套数组包含条件集,以及满足每组条件时要执行的等效操作。例如:
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中解决这种情况?
感谢。 如果您认为我可以改进这个问题,请告诉我。
答案 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>