Очистить несколько условий, в разные моменты, перед выполнением

#javascript #jquery #conditional-statements

#javascript #jquery #условные операторы

Вопрос:

Я ищу общий шаблон или метод для выполнения следующего:

Сервер отправляет сообщения клиенту (браузеру). Эти сообщения ПОСТУПАЮТ НЕ все вместе, а в разные моменты времени.

Для каждого входящего сообщения клиент сравнивает его со списком условий. Если сообщение соответствует условию, это условие выполняется.

Как только все условия выполнены, клиент выполняет некоторые заказы и переходит к следующему набору условий.

Это повторяется до тех пор, пока не будут выполнены все доступные наборы условий.

Мой фактический подход к этой проблеме заключается в следующем:

Набор вложенных массивов содержит наборы условий и эквивалентные действия, которые необходимо выполнить при выполнении каждого набора условий. Например:

 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. ДА… общий шаблон заключается в использовании массива обещаний и передаче этого массива в Promise.all(), и в обратном вызове вы получите ответы в том же порядке, в каком они были отправлены. Если вы используете jQuery как помеченный, можете использовать $.when() вместо Promise.all()

2. @charlietfl Спасибо за ответ. Хотя я читал об этом, я не совсем понимаю promises. Хотите написать подробный ответ, чтобы я мог его принять?

3. это запросы ajax, которые вы делаете?

4. @charlietfl нет, я использую «sillyserver» ( github.com/jagenjo/SillyServer.js ) для отправки сообщений между подключенными клиентами. Эти сообщения относятся к началу и концу синтеза или распознавания речи (web speech api). Я создаю какую-то условную оценку, которая включает синтез и распознавание для нескольких клиентов. Например, прежде чем клиенты 2 и 3 начнут синтезировать речь, мне нужно убедиться, что они завершили распознавание речи, и что клиент 1 также завершил синтез речи. Что-то в этом роде.

5. ok…so вы не можете перебирать серию запросов одновременно… вам нужно отправить, а затем дождаться ответа. Так что вместо массива обещаний… вам понадобится цепочка обещаний. Вы отправляете что-то… когда server.on возвращается соответствующее сообщение… это разрешило бы первое обещание, связанное с использованием then() для выполнения шага nest. Вы можете связать столько then() , сколько необходимо

Ответ №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>