2016-10-12 10 views
1

を実行する前に、私は次のことを達成するために、共通のパターンや方法を探しています:クリアいくつかの条件は、異なる瞬間に、

サーバー(ブラウザ)クライアントにメッセージを送信します。これらのメッセージは一斉に到着するのではなく、異なる瞬間に到着します。

受信メッセージごとに、クライアントはそれを条件リストと比較します。メッセージが条件と一致する場合、その条件は満たされます。

すべての条件が満たされると、クライアントはいくつかの注文を実行し、次の条件セットに移動します。

これは、使用可能なすべての条件が満たされるまで繰り返されます。この問題に対する

私の実際のアプローチは以下の通りである:

ネストされた配列の組は、各条件セットが満たされたときに実行する条件のセット、および同等のアクションを含みます。例:

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によく使用されるパターンまたはメソッドがありますか?

ありがとうございました。 質問を改善できると思ったら教えてください。

+2

はい...一般的なパターンは、約束の配列を使用してPromise.all(にその配列を渡す)、コールバックの中にすることですあなたは送信されたのと同じ順序で応答を持っています。タグ付きとしてjQueryを使用する場合、 'Promise.all()'の代わりに '$ .when()'を使用できます。 – charlietfl

+0

@charlietfl答えをありがとう。私はそれについて読んできましたが、私は約束を完全に理解していません。私はそれを受け入れることができるように詳細な答えを書くためのケア? –

+0

あなたが作っているこれらのajaxリクエストですか? – charlietfl

答えて

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>

関連する問題